Grep 反向引用问题

Grep 反向引用问题

对于类似这样的文本文件:

there is a blue beach ball

there is a green beach ball

there is a blue and green beach ball

there is a blue and blue beach ball

  • 在 Grep 反向引用命令中,例如grep -E '(blue|blue).*\1',数字1指的是什么?您将如何使用23等?当我将其更改为 时2,我收到一条错误,指出:invalid back reference

  • 为什么只匹配最后一行?

  • 为什么不grep -E '(blue|green).*\1'匹配第 3 行?

谢谢。

答案1

在你的正则表达式中,(blue|blue)是一个捕获组。当一个捕获组捕获了一个组后,\1可以用来指代被捕获的内容。(这就是为什么它被称为捕获:因为它会保留它,以便您以后可以使用它。)
如果您有第二个带括号的捕获组,则可以用\2它来引用它,或\3引用第三个,依此类推。

因此,正则表达式先匹配“blue”,然后匹配任意字符,最后再次匹配“blue”。这就是它不匹配前两行的原因。

当您将其更改为时(blue|green),它将匹配“蓝色”或“绿色”,然后匹配任何字符,然后无论捕获组匹配什么. 因此它匹配以下任一项:

there is a blue and blue beach ball
there is a green and green beach ball

但它与以下任何一个都不匹配:

there is a blue and green beach ball
there is a green and blue beach ball

如果您想要匹配这些,您将需要使用另一个组(无论它是否捕获),如下所示:grep -E '(blue|green).*(blue|green)'

相关内容