grep "+" 运算符不起作用

Mar*_*rko 40 grep

这个

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."
Run Code Online (Sandbox Code Playgroud)

输出这个:

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz
Run Code Online (Sandbox Code Playgroud)

但是这个:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."
Run Code Online (Sandbox Code Playgroud)

什么都不输出。

为什么?我刚换*+。不是很相似吗?运算符+只需要至少一个匹配项,*零个或多个匹配项。

MiJ*_*Jyn 46

这是因为grep(没有任何参数)仅适用于标准正则表达式。+是扩展正则表达式的一部分,因此要使用它,您需要使用grep -Eor egrep

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."
Run Code Online (Sandbox Code Playgroud)

此外,如果您不想使用扩展的正则表达式,您可以这样做:

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."
Run Code Online (Sandbox Code Playgroud)


Hen*_*eck 15

要详细说明 MiJyns 的答案,像 + 这样的“特殊字符”也可以在标准正则表达式中使用,但是您需要使用反斜杠将它们转义。您可能会说,标准正则表达式和扩展正则表达式之间的默认期望是相反的:

在标准正则表达式中,字符默认按字面匹配。例如,在grep "ab+"+ 中是文字 +。例如,正则表达式会找到“ab+ab”,而不是“abbbb”。要使用 + 的“特殊含义”,您需要对其进行转义。所以grep "ab\+"会找到“abbb”,但不再找到“ab+ab”。因为在最后一个例子中,+ 被解释为量词“一个或多个那个”,在这种情况下是“一个或多个 b”。

在扩展的正则表达式中,情况正好相反。在这里,您需要转义“特殊字符”才能按字面意思处理。所以grep -E "ab+"找到“abbb”,而不是“ab+ab”。如果你转义 +,它会按字面意思匹配。所以grep -E "ab\+"找到“ab+ab”,而不是“abbb”。