我試圖找到並替換一個或多個使用sed從BSD常規命令sed上的字符。如何在mac os x(BSD)sed上逃避加號?
我嘗試:
echo "foobar" | sed -e "s/o+//g
期待看到:
fbar
而是我看到
foobar
我當然只是手動展開加上:
echo "foobar" | sed -e "s/oo*//g"
但我需要做些什麼才能使加號工作?
我試圖找到並替換一個或多個使用sed從BSD常規命令sed上的字符。如何在mac os x(BSD)sed上逃避加號?
我嘗試:
echo "foobar" | sed -e "s/o+//g
期待看到:
fbar
而是我看到
foobar
我當然只是手動展開加上:
echo "foobar" | sed -e "s/oo*//g"
但我需要做些什麼才能使加號工作?
使用/g
標誌,s/o//g
就足以替換所有出現的事件。
爲什麼+
不能按預期工作:舊的,過時再+
是一個普通的字符(以及|
,?
)。您應指定-E
標誌sed
,使其利用現代正則表達式:
echo "foobar" | sed -E -e "s/o+//"
# fbar
來源:man 7 re_format
。
+1,其'-E'標誌按照描述工作。不過,出於某種原因,我無法在man/info頁面中找到它。正式地看起來,'-r'和'--regexp-extended'選項是要走的路。 – Chriki 2014-03-21 08:08:00
echo "foobar" | sed -e "s/o\\+//g"
在Mac OS X 10.6上爲我工作。
我記得我用GNU sed 4.2取代了我的BSD版本的sed,所以這可能會或可能不適合你。
不適用於10.5 ... – khachik 2010-12-15 19:06:40
在Terminal.app中,您可能需要使用雙反斜槓。 – eyelidlessness 2010-12-15 19:09:41
@eyelidlessness也不起作用。查看我的答案以獲取更多信息。 – khachik 2010-12-15 19:16:15
Sed對正則表達式感到難過。你既可以試試-E,這可能與BSD工作,或者你可以試試這個來代替:
sed -e "s/o\{1,\}/"
也許有太多的SED公司在那裏有任何系統上可用的工具。
你可以在linux或unix上使用它。
echo "foobar" | perl -pe "s/o+//g"
這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – 2015-08-14 09:49:03
使用這可以解決問題,並且不需要關心逃逸問題。 – 2015-08-14 10:11:19
使用'/ g'標誌,'s/o // g'就足以代替所有'o'事件。 – khachik 2010-12-15 19:09:34