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
。
在 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
。