2010-12-15 42 views
15

我試圖找到並替換一個或多個使用sed從BSD常規命令sed上的字符。如何在mac os x(BSD)sed上逃避加號?

我嘗試:

echo "foobar" | sed -e "s/o+//g 

期待看到:

fbar 

而是我看到

foobar 

我當然只是手動展開加上:

echo "foobar" | sed -e "s/oo*//g" 

但我需要做些什麼才能使加號工作?

+0

使用'/ g'標誌,'s/o // g'就足以代替所有'o'事件。 – khachik 2010-12-15 19:09:34

回答

27

使用/g標誌,s/o//g就足以替換所有出現的事件。

爲什麼+不能按預期工作:舊的,過時再+是一個普通的字符(以及|?)。您應指定-E標誌sed,使其利用現代正則表達式:

echo "foobar" | sed -E -e "s/o+//" 
# fbar 

來源:man 7 re_format

+0

+1,其'-E'標誌按照描述工作。不過,出於某種原因,我無法在man/info頁面中找到它。正式地看起來,'-r'和'--regexp-extended'選項是要走的路。 – Chriki 2014-03-21 08:08:00

2
echo "foobar" | sed -e "s/o\\+//g" 

在Mac OS X 10.6上爲我工作。

我記得我用GNU sed 4.2取代了我的BSD版本的sed,所以這可能會或可能不適合你。

+0

不適用於10.5 ... – khachik 2010-12-15 19:06:40

+0

在Terminal.app中,您可能需要使用雙反斜槓。 – eyelidlessness 2010-12-15 19:09:41

+0

@eyelidlessness也不起作用。查看我的答案以獲取更多信息。 – khachik 2010-12-15 19:16:15

0

Sed對正則表達式感到難過。你既可以試試-E,這可能與BSD工作,或者你可以試試這個來代替:

sed -e "s/o\{1,\}/" 

也許有太多的SED公司在那裏有任何系統上可用的工具。

0

你可以在linux或unix上使用它。

echo "foobar" | perl -pe "s/o+//g" 
+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – 2015-08-14 09:49:03

+0

使用這可以解決問題,並且不需要關心逃逸問題。 – 2015-08-14 10:11:19