【发布时间】:2014-08-06 17:26:57
【问题描述】:
在 Linux 上,它按预期运行:
$ echo -e "line1\r\nline2"|awk -v RS="\r\n" '/^line/ {print "awk: "$0}'
awk: line1
awk: line2
但在 windows 下,\r 被删除(awk 认为这一行):
窗户:
$ echo -e "line1\r\nline2"|awk -v RS="\r\n" '/^line/ {print "awk: "$0}'
awk: line1
line2
Windows GNU awk 4.0.1 Linux GNU awk 3.1.8
来自@EdMorton 的编辑(对不起,如果这是一个不需要的添加,但我认为它可能有助于证明问题):
考虑这个 RS 设置和输入(在 cygwin 上):
$ awk 'BEGIN{printf "\"%s\"\n", RS}' | cat -v
"
"
$ echo -e "line1\r\nline2" | cat -v
line1^M
line2
这是带有 gawk 的 Solaris:
$ echo -e "line1\r\nline2" | awk '1' | cat -v
line1^M
line2
这是带有 gawk 的 cygwin:
$ echo -e "line1\r\nline2" | awk '1' | cat -v
line1
line2
RS 只是它的默认换行符,那么 cygwin 中的 control-M 去了哪里?
【问题讨论】:
-
是的,我也在 cygwin 中看到过。我懒得去调查或调试它,而且我很少有文件中有
\rs,所以必要时我只是在它前面贴了一个tr -d '\r' | awk ...以删除\rs。不过,希望有人能提供一些启示 - 好问题! -
你试过
-v IRS吗?注意 I 输入 -
awk -v IRS=something?这会将名为IRS的未使用的、用户定义的awk 变量设置为something。对这个问题没有影响。 -
@EdMorton 确实,我没有测试它。我只是假设与 FS 一样。
-
问题似乎是
awk永远不会匹配\r作为记录分隔符,更不用说\r\n。我尝试了不同的符号,例如\015和\x0d,但它仍然不匹配。我还通过使用文件作为输入而不是来自echo的管道来排除echo是罪魁祸首。看来awk确实无法匹配\r。