MacOS Catalina上的sed/gsed与star不符合预期
我尝试了以下方法:MacOS Catalina上的sed/gsed与star不符合预期,macos,sed,Macos,Sed,我尝试了以下方法: # echo "12MB" | sed -e 's/[bm]\*//i' 12MB # echo "12MB" | sed -e 's/[bm]\+//i' 12 我原以为两者都会产生相同的输出(贪婪匹配),但带星号的那个不会。我也尝试过gsed,但结果是一样的。 当我尝试将-E#用于扩展re时,这两种形式都不起作用。 ubuntu docker容器的行为也与此相同 有人能帮我理解为什么吗?首先,在sed“basic”regexp模式
# echo "12MB" | sed -e 's/[bm]\*//i'
12MB
# echo "12MB" | sed -e 's/[bm]\+//i'
12
我原以为两者都会产生相同的输出(贪婪匹配),但带星号的那个不会。我也尝试过gsed,但结果是一样的。
当我尝试将-E#用于扩展re
时,这两种形式都不起作用。
ubuntu docker容器的行为也与此相同
有人能帮我理解为什么吗?首先,在sed“basic”regexp模式中,*
表示重复,\*
是一个文字星号。所以你的例子是
# echo "12MB" | sed -e 's/[bm]*//i'
12MB
。。。这仍然不能产生您的预期输出
当您使用可见的替换件时,原因变得显而易见:
# echo "12MB" | sed -e 's/[bm]*/!!!/i'
!!!12MB
模式正好在字符串的开头匹配,重复计数为零。在一场比赛后,更换停止
因此,您确实需要一个或多个重复,就像在您的工作示例中一样。@kisch下面的答案解释了很多,非常有用,但是我仍然不明白为什么转义加号与转义星号不一样(它在转义加号的情况下工作)。sed基本regexp语法有点混乱。转义加号是regexp重复运算符,表示“匹配一次或多次”。在本例中,模式在字符串中的“M”处匹配,并且有一个重复扩展到“B”。转义星号是文字星号,因此模式在字符串中根本无法匹配。