Linux和mingw64上使用CRLF行结尾的不同awk结果
在Linux上: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
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