我试图找到并替换一个或多个使用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