【问题标题】:sed on OS X - can't seem to use + in regexpsOS X 上的 sed - 似乎无法在正则表达式中使用 +
【发布时间】:2010-11-16 15:56:35
【问题描述】:

现在根据所有文献

echo 1234abcd|sed "s|[0-9]\+|#|g"

应该输出#abcd。和

echo abcd|sed "s|[0-9]\+|#|g"

应该输出 abcd。

但在 OS X 10.4.11 上,第一个表达式输出 1234abcd。使用 * 而不是 + 对第一个示例有效,但在第二个示例中失败,输出 #abcd,因为 [0-9] 模式匹配零次。

+ 运算符在 OS X 的正则表达式中不起作用吗?有其他选择吗?

谢谢

【问题讨论】:

  • sed 不会“返回 abcd”。它返回 0,并输出“abcd”。程序的输出不是它的返回值。
  • 您说得非常正确,先生。我现在正在修复。

标签: regex macos sed


【解决方案1】:

在 OSX 上,sed 默认使用基本 RE。如果你想使用现代 RE,你应该使用 sed -E,包括 "+" 一个或多个运算符。

请参阅 here 以了解 sed 默认使用基本 RE,here 用于现代 RE 语法,here 用于基本 RE (ed) 信息。


或者,如果您有一个完全不支持+的正则表达式引擎,您可以通过转换(例如)简单地使用*

[a-z]+

进入:

[a-z][a-z]*

【讨论】:

  • 这个答案在技术上是正确的,但是我一直对 -E 标志感到沮丧,因为它不能移植到 Linux 发行版中通常包含的任何 sed 版本。警告 Emptor。
  • @JayTaylor 我刚来这里是因为我的正则表达式在 Ubuntu Lucid 上不能正常工作,指定 -E 解决了这个问题。
  • @AndreKR -E 标志将在您使用正则表达式的扩展方言时起作用。我希望我能提供更多帮助,如果没有更多细节,我无话可说!
  • @JayTaylor 我以为你是说在 Linux 上 -E 标志不起作用。我发现它不仅适用于 Linux,如果你想使用量词,它甚至是必要的。
  • 现在我明白了混淆点;是的! -E 标志可在 Mac 和兼容 POSIX 的 Linux 版本 sed 之间移植。干杯。
【解决方案2】:

过时的基本正则表达式不支持+? 量词。它们是常规字符。

[0-9]+ 的替代品是例如[0-9]{1,}[0-9][0-9]*

或者您可以使用sed -E 来使用现代的扩展正则表达式。

【讨论】:

  • 看起来-E 仍然没有给你真正的“现代”正则表达式,因为它仍然缺少对其他标准事物的支持,比如\d
【解决方案3】:

如果 + 不起作用,您始终可以使用 {1,}

【讨论】:

    【解决方案4】:

    你可以使用 awk

    # echo 1234abcd| awk '{gsub(/[0-9]+/,"#")}1'
    #abcd
    
    # echo abcd| awk '{gsub(/[0-9]+/,"#")}1'
    abcd
    

    【讨论】:

    • 我想我接下来必须学习 awk。不过,我仍然对 sed 感兴趣。
    • 不会阻止你学习 sed,但是一旦你知道了 awk 的进出,就没有必要再使用 sed 了。
    【解决方案5】:

    许多 OS X unix 实用程序的版本缺乏 GNU 等价物的舒适性。正如 Pax 所说,您可以使用 -E:

    drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed "s/[0-9]\+/#/g" 
    1234abcd
    drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed -E "s/[0-9]+/#/g" 
    #abcd
    

    请注意,需要对正则表达式的语法进行细微更改(在本例中为 \+ 到 +)。

    不过,我更喜欢使用 fink 来获取 GNU 实用程序:

    drigz@mbp drigz 0$ echo 1234abcd | /sw/bin/sed "s/[0-9]\+/#/g"
    #abcd
    drigz@mbp drigz 0$ /sw/bin/sed --version
    GNU sed version 4.1.5
    Copyright (C) 2003 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
    to the extent permitted by law.
    

    【讨论】:

    • 我假设你的意思是 \\+ 到 + (格式似乎已经吃掉了转义字符)不幸的是,这个地方的防火墙似乎阻止了 fink 和 macports,所以有很多og GNU fun 我无法访问。
    • hmm.. 有时它会吃掉 \ 有时不会
    • 是的 - 你是对的。你能用旧的方式安装它们吗? (./configure && make && sudo make install)
    • 好主意。我去寻找源头。
    • 自从我发布了我的最后一条评论后,我发现了 Hombrew,因此无需编译或确实使用 fink 或 macports:brew.sh
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2015-08-19
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多