据我了解,反斜杠后跟一个字符是正则表达式。
但我不明白这个命令的作用。
$ 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