【问题标题】:sed/gsed on MacOS Catalina not working as expected with starMacOS Catalina 上的 sed/gsed 与 star 无法正常工作
【发布时间】:2021-01-16 15:38:22
【问题描述】:

我尝试了以下方法:

# echo "12MB" | sed -e 's/[bm]\*//i'
12MB
# echo "12MB" | sed -e 's/[bm]\+//i'
12

我希望两者都能产生相同的输出(贪婪匹配),但带有星号的输出却没有。我也尝试过使用 gsed,但结果相同。 当我尝试使用-E # for extended re 时,这两种形式都不起作用。 ubuntu docker 容器的行为也相同。

谁能帮我理解这是为什么?

【问题讨论】:

  • @kisch 下面的答案解释了很多并且非常有帮助,但是我仍然很困惑为什么转义的加号与转义的星号不同(它适用于转义的加号) )。
  • sed 基本的正则表达式语法有点混乱。转义的加号是正则表达式重复运算符,意思是“匹配一次或多次”。在这种情况下,模式匹配字符串中的“M”,并且重复一次延伸到“B”。转义的星号是文字星号,因此该模式在您的字符串中根本无法匹配。

标签: macos sed


【解决方案1】:

首先,在 sed “基本”正则表达式模式中,* 用于重复,\* 是文字星号。所以你的例子是

# echo "12MB" | sed -e 's/[bm]*//i'
12MB

...仍然没有产生您预期的输出。

当您使用可见替换时,原因就很明显了:

# echo "12MB" | sed -e 's/[bm]*/!!!/i'
!!!12MB

模式匹配字符串的开头,重复计数为零。一场比赛后,替换停止。

所以你真的想要一个或多个重复,就像在你的工作示例中一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 2017-07-15
    • 1970-01-01
    • 2022-08-02
    • 2020-12-26
    • 2020-03-09
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多