Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MacOS Catalina上的sed/gsed与star不符合预期_Macos_Sed - Fatal编程技术网

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”。转义星号是文字星号,因此模式在字符串中根本无法匹配。