Sed 从 OSX 开始的行覆盖匹配组

Sed overwrites match groups from line beginning in OSX

在 OSX 中,sed 的行为如下:

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

虽然我期待以下内容:

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

我只是使用 xxx 匹配一行,然后将其他所有内容放在我构造的字符串中的某个位置。它似乎与 \r 有关,但我不太确定如何修复它,而不先从文本文件中删除 \r。 (上面的例子没有提到任何文本文件,但你可以想象 echo 的输出是在一个文本文件中)。

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

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

测试于 OS X:

[STEP 107] $ printf 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/->/g'
->c
-> bb cc
[STEP 108] $ printf 'xxx abc\r\nxxx aa bb cc\r\n' | sed -E 's/xxx (.*)/->/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 (.*)/->/g'
abc->
aa bb cc->
[STEP 110] $ printf 'abc\r->\n'
->c
[STEP 111] $

printf 'abc\r->\n'为例:先打印abc,然后\r将光标移回行首,然后打印->会覆盖 ab,所以最后我们看到 ->c