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
在 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