所以我试图找到 6 个字母的单词,其中一个字符重复 3 次,后跟另一个字符重复 3 次。例如aaabbb
或oookkk
.
我在尝试:
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}'