【问题标题】:How to escape plus sign on mac os x (BSD) sed?如何在mac os x(BSD)sed上转义加号?
【发布时间】:2015-08-14 16:49:39
【问题描述】:

我正在尝试在 Mac 上使用 sed(来自 BSD 通用命令的 sed)查找和替换出现的一个或多个字符。

我试试:

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

期待看到:

fbar

但是我看到了

foobar

我当然可以手动扩展加号:

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

但是我必须做什么才能使加号正常工作?

【问题讨论】:

  • 使用/g 标志,s/o//g 足以替换所有出现的o

标签: regex macos bash sed grep


【解决方案1】:

使用/g 标志,s/o//g 足以替换所有出现的 o。

为什么+ 不能按预期工作:在旧的、已过时的+ 是一个普通字符(以及|?)。您应该将 -E 标志指定为 sed 以使用现代正则表达式:

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

来源:man 7 re_format

【讨论】:

  • +1,使用-E 标志,它按描述工作。不过,出于某种原因,我在 man/info 页面中找不到它。正式看来,-r--regexp-extended 选项是要走的路。
【解决方案2】:

Sed 对正则表达式感到难过。你可以试试 -E,它可能适用于 BSD,或者你可以试试这个:

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

也许有太多的 sed 在任何系统上都没有可用的工具。

【讨论】:

    【解决方案3】:
    echo "foobar" | sed -e "s/o\\+//g"
    

    在 Mac OS X 10.6 上为我工作。

    我记得我用 GNU sed 4.2 替换了我的 BSD 版本的 sed,所以这可能适合你,也可能不适合你。

    【讨论】:

    • 在 Terminal.app 中您可能需要使用双反斜杠。
    • @eyelidlessness 也不起作用。有关更多信息,请参阅我的答案。
    【解决方案4】:

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

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

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • 使用这个就可以解决问题,不用关心逃逸问题。
    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2010-12-11
    • 2014-02-26
    • 2011-03-27
    • 2012-12-23
    相关资源
    最近更新 更多