使用 grep 命令和反向引用

Sir*_*rus 2 grep regular-expression

这是一个非常基本的问题,但我无法理解。我正在学习 Linux,我收到的问题之一是;

*感伤这个词包括出现三次的相同的三个字符(例如“ent”)。单词“blayblapblam”也包含重复三次的相同的三个字符(例如“bla”)。

你能找到多少个包含任意三个字符重复三次的单词,比如“sentimentalment”和“blayblapblam”,但也以小写的“d”开头。使用 /usr/share/dict/words 作为可能的单词列表,并使用 grep 找到答案。“d”不是检测三字符字符串时考虑的字符之一。*

到目前为止,我可以返回相同的三个字母出现两次的实例;

grep -E '^d(...).*\1' /usr/share/dict/words > output
Run Code Online (Sandbox Code Playgroud)

在我看来,查找以 'd' 开头的单词,然后在同一组 (1) 之前再次出现三个字母、0 个或多个字符的组合。

我试过以下;

grep -E '^d(...).*\1.*\1' /usr/share/dict/words > output
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的(显然不是),则返回第一组,然后返回零个或多个字符,然后再返回第一组。

有人能指出我哪里出错了吗?任何帮助表示赞赏。

小智 9

看来您已将三个字母固定在d. 也许你需要这样的东西:

grep -E '^d.*(...).*\1' /usr/share/dict/words > output

这将使您的 3 模式搜索成为

grep -E '^d.*(...).*\1.*\1' /usr/share/dict/words > output

出于可移植性的原因,应该避免将扩展的正则表达式与反向引用相结合,因此更好地使用

grep '^d.*\(...\).*\1.*\1' /usr/share/dict/words > output

  • @Utku 不,`grep` 将打印任何行,只要该行的一部分与给定的模式匹配。您不需要匹配整行。 (2认同)