Linux和mingw64上使用CRLF行结尾的不同awk结果

Linux和mingw64上使用CRLF行结尾的不同awk结果,awk,mingw,mingw-w64,Awk,Mingw,Mingw W64,在Linux上: echo -n $'boo\r\nboo\r\n' | awk $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v 返回预期的 foo^M foo^M 但是,在mingw64(git bash for windows)上,相同的命令返回: foo foo 没有马车返回 我尝试显式地设置记录分隔符,因为两个平台之间的默认值可能不同,但mingw64上的awk仍在处理回车。我如何让awk在mingw64上的Lin

在Linux上:

echo -n $'boo\r\nboo\r\n' | awk $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v
返回预期的

foo^M
foo^M
但是,在mingw64(git bash for windows)上,相同的命令返回:

foo
foo
没有马车返回

我尝试显式地设置记录分隔符,因为两个平台之间的默认值可能不同,但mingw64上的awk仍在处理回车。我如何让awk在mingw64上的Linux上做同样的事情?请注意,awk版本略有不同(Linux上的GNU awk 4.0.2和mingw64上的GNU awk 4.2.1),但我不认为这有什么关系,除非有某种bug

请注意,自mingw64起,awk中特别发生了一些事情:

echo -n $'boo\r\nboo\r\n' | cat -v
返回预期的:

boo^M
boo^M

在搜索了一段时间后,我发现,并且来自:

这是由C库完成的,为了阻止它发生,应该将awk BINMODE变量设置为3

我将您的代码更改为:

echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v
并在Unix、Linux、MacOS和Windows上进行了尝试,都产生了以下输出:

foo^M
foo^M
所以
-v BINMODE=3
就是您要寻找的。
注意只有
-v BINMODE=3
此开关在代码方式工作之前。
通常我们可以通过
-v
开关,在
开始
块中,将变量传递给awk,或者在文件之前的代码之后设置它,
但在本例中,我尝试了三种方法,只有
-v BINMODE=3
有效。
我猜这与
awk
的编译过程有关

示例(在Windows上的
cygwin
下):

在其他提到的平台下,它们都生产:

boo^M
boo^M

来自cygwin的GNU awk 4.1.4,相同。感谢您提出这个问题。当读取输入数据时,在Windows上转换Windows样式的行尾可能足够聪明。找到解决方案,请检查下面的答案。我建议你检查我链接到的问题和答案,并向上投票:)
boo^M
boo^M