【问题标题】:Difference between [0-9]* and [0-9]+ in sedsed 中 [0-9]* 和 [0-9]+ 的区别
【发布时间】:2019-09-21 12:25:02
【问题描述】:

据我了解,* 匹配零个或多个,+ 匹配一个或多个。 所以当我在 macOS 上这样做时:

echo "1" |  sed 's/[0-9]*//g'

号码已被删除。

但如果我这样做:

echo "1" |  sed 's/[0-9]+//g'

号码仍然存在。

但是 [0-9]+ 不应该也匹配“1”吗?

【问题讨论】:

标签: regex sed


【解决方案1】:

这(可能)是关于 sed 命令是否在 POSIX(严格)模式下运行,或者是否启用了 GNU 扩展。

在 POSIX 模式中,sed 正则表达式中的 + 不是元字符。

在 GNU 扩展模式中,+ 表示“一个或多个重复”。使用 -E 选项启用 GNU 扩展。

有关 sed 正则表达式的更多信息:

【讨论】:

  • 这不是 GNU 与非 GNU(MacOS 有 BSD sed),而是关于 BRE(基本正则表达式与 ERE(扩展正则表达式)。两者都在 POSIX 规范中进行了描述. -E 选项将表达式解释为 ERE。
【解决方案2】:

sed 中的+ 被视为扩展正则表达式的一部分,因此默认情况下,+ 不被识别为特殊字符。使用-E 标志来启用扩展正则表达式,如下所示:

echo "1" |  sed -E 's/[0-9]+//g'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多