【问题标题】:Different awk results on Linux and mingw64 with CRLF line endings带有 CRLF 行结尾的 Linux 和 mingw64 上的不同 awk 结果
【发布时间】:2019-03-08 05:12:58
【问题描述】:

在 Linux 上:

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

返回预期的

foo^M
foo^M

但是,在 mingw64(Windows 的 git bash)上返回相同的命令:

foo
foo

没有回车。

我尝试显式设置记录分隔符,因为两个平台之间的默认值可能不同,但是 mingw64 上的 awk 仍在咀嚼回车。我怎样才能让 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

返回预期:

boo^M
boo^M

【问题讨论】:

  • GNU awk 4.1.4 来自cygwin,相同。感谢您提出这个问题。
  • 想必它在读取输入数据时在 Windows 上转换 Windows 样式的行尾已经足够聪明了。
  • 找到了解决方案,在下面查看我的答案。我建议你检查我链接到的问题和答案,并给他们投票:)

标签: awk mingw mingw-w64


【解决方案1】:

找了一阵子,找到了this question,从this answer

这是由 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,在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

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2020-10-16
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2011-04-24
    相关资源
    最近更新 更多