2014-10-31 139 views
2

下面的命令sed和正则表达式简单:奇怪的桑达输出

echo 'Atest Atest Atest' | sed -E 's/A|$/B/g' 

产生输出:

Btest Btest B 

可能有人解释,请,为什么吃sed的最后一个字?我预计输出是这样的:

Btest Btest BtestB 

我使用与Mac OS捆绑在一起的sed版本(“BSD-flavor”)。

更新 与GNU sed相比,此行为看起来像一个错误,所以我选择了坚持后者。

+2

工作细到我的'sed的(GNU SED)4.2.2'。 – fedorqui 2014-10-31 14:23:51

+0

我的sed(4.2.2)返回你的期望。它在Windows下的cygwin下的zsh – 2014-10-31 14:24:12

+0

适用于我。 sed 4.2.1也能像你期望的那样工作。 – flob 2014-10-31 14:27:13

回答

3

有趣的是,这似乎是在OSX上可用的BSD sed中的一些错误(奇怪的行为)。我可以重现这种行为。看起来这种行为只发生在g标志。

为了解决这个问题,我建议使用这种等价sed命令:

echo 'Atest Atest Atest' | sed 's/A/B/g;s/$/B/' 
Btest Btest BtestB 
+0

什么是“sed保持取代每个$ B”是什么意思? – ooga 2014-10-31 14:36:01

+0

'echo'foo'| sed -E'/ f | $/B /''变为'boo',但是'echo'foo'| sed -E'/ f | $/B/g''在OSX sed上变成'B'。 – anubhava 2014-10-31 14:40:00

+0

另一个奇怪的行为:'echo'foo'| sed -E'/^| $/B/g''变成'Bfoo'而不是'BfooB' – anubhava 2014-10-31 14:42:14