Linux 和带有 CRLF 行结尾的 mingw64 上的不同 awk 结果

Different awk results on Linux and mingw64 with CRLF line endings

在 Linux:

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

returns 预期

foo^M
foo^M

但是,在 mingw64 上(git bash for windows)相同的命令 returns:

foo
foo

没有马车returns.

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

请注意,自从在 mingw64 上,awk 中发生了一些特别的事情:

echo -n $'boo\r\nboo\r\n' | cat -v

returns 预期:

boo^M
boo^M

搜索了一段时间后,我找到了 this question, And from this answer :

it's something done by the C libraries and to stop it happening you should set the awk BINMODE variable to 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,在 BEGIN 块中,或者在文件之前的代码之后设置它,
但在这种情况下,我尝试了三种方法,只有 -v BINMODE=3 有效。
猜猜这与awk的编译过程有关。

示例(在 Windows 上的 cygwin 下):

$ echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 '1' | cat -v    
boo^M                                                          
boo^M                                                          

$ echo -n $'boo\r\nboo\r\n' | awk 'BEGIN{BINMODE=3}1' | cat -v 
boo                                                            
boo                                                            

$ echo -n $'boo\r\nboo\r\n' | awk '1' BINMODE=3 | cat -v       
boo                                                            
boo                  

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

boo^M
boo^M