grep:kleene星(*)什么时候应该匹配?

时间:2013-01-08 06:43:56

标签: linux grep kleene-star

我正在学习grep atm,但我很难理解kleene星形元字符的工作原理。手册页描述*匹配前一个字符零次或多次。我正在使用名为test的文件,其中包含以下内容

*a
123ab
1234
abcdef
a?
?

grep 'a*' test应匹配零个或多个a次出现,并按说明打印输出中test文件的每一行。 该文档进一步描述了要匹配像*这样的元字符,必须使用反斜杠\对其进行转义。 但grep '*' testgrep '\*' test的输出相同。输出:*a 为什么*在没有前缀\的情况下匹配自己?

2 个答案:

答案 0 :(得分:3)

*本身是一个无效的正则表达式,因为之前没有要重复的项目。在这种情况下,您的grep实现会将其解释为文字*\*是与*匹配的有效正则表达式。您的实现对无效正则表达式*和有效正则表达式\*的解释恰好相同。

如果您确实希望看到*\*之间的区别,则应通过在其前面添加项目来尝试使用有效的正则表达式。例如,文字a

grep 'a*'
grep 'a\*'

前者将匹配任何内容,因为*可以成功匹配零个字符。后者只会按字面意思匹配包含a*的行。

答案 1 :(得分:3)

正则表达式中的前导*根据section 9.3.3 of SUSv3有效。火影忍者,你的平台的正则表达式解释器在这里做正确的事情:*当它在正则表达式的开头时不是一个特殊字符。