2017-04-19 23 views
0

在OSX开始,sed的如下行为:桑达覆盖匹配群体从线OSX

echo -en 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' 
->c 
-> bb cc 

虽然我期待下面:

echo -en 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' 
abc-> 
aa bb cc-> 

我只是匹配使用xxx然后一行把所有其他地方放在我构建的字符串中。它似乎与\r有关,但我不太清楚如何修复它,而不是先从文本文件中首先修剪\r。 (上面的例子没有提到任何文本文件,但你可以想象echo的输出是在一个文本文件中)。

任何解释为什么->覆盖组匹配?

+0

你想保留'\ r'吗?尝试'sed -E's/\ r //; s/xxx(。*)/ \ 1 - >/g; s/$/\ r /'' – Sundeep

+0

OSX中的文件有这些文件,但我当然不需要'\ r',虽然转储它们会使这些文件在OSX中看起来很糟糕。另外,在你的解决方案中,' - >'也会消掉字符。 – hyiltiz

+0

我在sed(GNU sed)4.2.2'上检查过它,并且它给出了您的预期输出... – Sundeep

回答

1

这是由carriage-return\r)字符引起的。

测试在OS X:

[STEP 107] $ printf 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' 
->c 
-> bb cc 
[STEP 108] $ printf 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/\1->/g' \ 
      | hexdump -C 
00000000 61 62 63 0d 2d 3e 0a 61 61 20 62 62 20 63 63 0d |abc.->.aa bb cc.| 
00000010 2d 3e 0a           |->.| 
[STEP 109] $ printf 'xxx abc\nxxx aa bb cc\n' | sed -E 's/xxx (.*)/\1->/g' 
abc-> 
aa bb cc-> 
[STEP 110] $ printf 'abc\r->\n' 
->c 
[STEP 111] $ 

printf 'abc\r->\n'例如:它会先打印abc,然后\r将光标移动回行的开头,然后打印->这将覆盖ab,所以最后我们看到->c

+0

是的!我弄清楚它与匹配和打印OSX中的'\ r'有关。但我从来不知道'\ r \ n'实际上代表了“开始刷新,然后进入下一行”。谢谢! – hyiltiz