2010-12-15 19 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