grep 中的正则表达式、反斜杠和括号

grep 中的正则表达式、反斜杠和括号

据我了解,反斜杠后跟一个字符是正则表达式。

但我不明白这个命令的作用。

$ grep '\(.\)\1' < exemple
22
88 9999 88
$ cat exemple
1 1 1 1 1
abc bc fghi
123 45 678
ABC BC FGHI
88 9999 88

点应该匹配任何字符,括号匹配一种模式(不确定这个),我不明白 \1 的作用。

答案1

您的正则表达式\(.\)\1将会匹配任何带有某个字符且后跟相同字符的行。匹配.任何单个字符,点周围的\(\)“捕获”匹配的子字符串,并且 是\1指向第一个捕获组的反向引用,即之前刚刚匹配的字符。

在您的示例输入中,有一行与此表达式匹配:

88 9999 88

在这里,表达式将匹配初始88子字符串,grep因此将该行输出到其标准输出流。

请注意,您的陈述“反斜杠后跟一个字符是正则表达式”有点误导。整个表达式是一个正则表达式(在本例中,是“基本”正则表达式,而不是“扩展”正则表达式),反斜杠修改某些字符的含义。例如,如果您使用\[,反斜杠将会已删除的特殊含义[(它引入了一个括号表达式,匹配一组中的单个字符),并且会强制匹配文字左括号。

字符串不是正则表达式,因为它包含反斜杠。它是一个正则表达式,因为您将它与将其解释为正则表达式的实用程序一起使用。甚至诸如此类的字符串也hello可以用作正则表达式(因此,它匹配包含hello子字符串的任何字符串)。

答案2

\1 看起来是对捕获组的反向引用(括号包围的部分)。这在您可能只想输出匹配的特定部分的情况下非常有用。我不久前用过这些:https://stackoverflow.com/questions/65641590/sed-expression-just-prints-entire-file

相关内容