使用 grep 的反向引用无效

使用 grep 的反向引用无效

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

我在尝试:

grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename

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

答案1

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

grep -E '([a-z])\1{2}([a-z])\2{2}'

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

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

grep -wE '([a-z])\1{2}([a-z])\2{2}'

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

grep -owE '([a-z])\1{2}([a-z])\2{2}'

相关内容