使用grep的无效反向引用


9

因此,我试图找到6个字母的单词,这些单词由一个字符重复3次,然后再由另一个字符重复3次组成。例如aaabbboookkk

我在尝试:

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

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


1
请说明您到底需要匹配什么。您的正则表达式不正确,因此我无法理解您的要求。您要查找的单词由一个字符的3个重复组成,然后由另一个字符的3个重复组成吗?还是您也想比赛aaabbbfoobar?那aaaabbb呢 理想情况下,请向我们展示一些示例输入和所需的输出。
terdon

1
反向引用应指向某事物,而您尚未指定该事物是什么。通常,您可以使用括号将表达式分组。例如:grep -E '([a-z]{2})([0-9]{2})\2\1'将匹配aa9999aa
muru

@terdon您要查找的单词由一个字符的3个重复组成,然后由另一个字符的3个重复组成吗?是。还是您也想匹配aaabbbfoobar?号等唯一的话oookkk(不超过6个字符)含有不字oookkkoookkkfoobar
亮点厂

@HighlightsFactory OK,在这种情况下,请使用grep -w我在答案中给出的示例。
terdon

还有一件事,您还想匹配aaaaaa还是至少需要两个不同的字符?请考虑提供示例输入和所需的输出。
terdon

Answers:


12

不,这是不正确的。我不知道\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}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.