2014-10-31 61 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