使用 grep 的反向引用无效

Hig*_*ory 10 command-line grep regular-expression

所以我试图找到 6 个字母的单词,其中包含一个重复 3 次的字符,然后是另一个重复 3 次的字符。例如aaabbboookkk

我在尝试:

grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename
Run Code Online (Sandbox Code Playgroud)

首先,正则表达式是否正确?其次为什么我得到grep: Invalid back reference

ter*_*don 15

不,这是不正确的。我不知道\1{3}应该是什么,但这就是导致您出现问题的原因。如果要查找包含三个重复字符后跟三个其他重复字符的行,可以使用以下命令:

grep -E '([a-z])\1{2}([a-z])\2{2}'
Run Code Online (Sandbox Code Playgroud)

\1是指第一捕获基团。您可以使用括号捕获组。然后,\1是第一个这样的组,\2是第二个,依此类推。由于您没有捕获的组,grep因此抱怨无效参考,因为它没有任何参考。因此,在上面的正则表达式中,括号捕获了两个组。然后,您想要{2}而不是{3}因为初始匹配也被计算在内。

您没有指定是否需要匹配是一个单词,或者您是否还想在单词内进行匹配。如果您希望整个单词匹配(并排除诸如 之类的内容aaaabbb,请改用:

grep -wE '([a-z])\1{2}([a-z])\2{2}'
Run Code Online (Sandbox Code Playgroud)

要仅打印行(单词)的匹配部分而不是整行,请使用(仅限 GNU grep):

grep -owE '([a-z])\1{2}([a-z])\2{2}'
Run Code Online (Sandbox Code Playgroud)