grep“ +”运算符不起作用


31

这个

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

输出此:

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

但是这个:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

什么都不输出。

为什么?我只是更改*+。相似吗?运算符+仅需要至少一个匹配,并且*零个或多个。

Answers:


36

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

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

另外,如果您不想使用扩展的正则表达式,则可以执行以下操作:

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."

谢谢。我现在讨论该解决方法,但是我想知道为什么“ +”不起作用。现在我知道了。再次感谢。
Marko

11

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

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

在扩展正则表达式中,情况恰恰相反。在这里,您需要转义“特殊字符”以进行字面处理。因此grep -E "ab+"找到“ abbb”,但找不到“ ab + ab”。如果您对+进行转义,它将得到字面上的匹配。因此grep -E "ab\+"找到“ ab + ab”,而不是“ abbb”。


1
就像魔术和超魔术一样,传统的混乱……;-)成为了vim。嗯 向后兼容性需要付出的代价……
Rmano 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.