grep 查找在同一个单词中出现两次的字母对

grep 查找在同一个单词中出现两次的字母对

查找具有在同一个单词中出现两次的一对字母的任何单词的正确表达式是什么?这是我正在使用的 grep 但显然它不起作用:

grep -E '(.{2}).*\1' input

输入示例:

tea sea
halal
unix
linux
Mississippi

输出将是:

halal
Mississippi

答案1

grep -E '(..).*\1' input

表达式因此为:

  NODE                     EXPLANATION
  (                        group and capture to \1:
    .                        any character except \n
    .                        any character except \n
  )                        end of \1
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
  \1                       what was matched by capture \1

答案2

问题在于您将扩展正则表达式与反向引用结合起来。但这些被故意排除在标准之外。所以使用

grep '\(.\{2\}\).*\1' input

反而。或者,更简单、更好读

grep '\(..\).*\1' input

编辑:

在重新阅读你的问题时,我发现我读了“两次用同一个词”。您的输入数据每行仅包含一个单词,因此没关系,但我将更改问题以包含相关的测试用例。

对于“同一个单词两次”,您可以使用

grep '\(..\)[[:alnum:]]*\1' input

或者在某些版本上grep使用快捷方式

grep '\(..\)\w*\1' input

答案3

POSIXly:

grep '\([[:alpha:]]\{2\}\)[^[:space:]]*\1'

将输出包含两个字母字符序列的行,后跟任意数量的字符(间隔字符除外),后跟相同的字母字符序列。

请注意,POSIX ERE 不支持反向引用,只有 BRE 支持,尽管某些grep实现支持 ERE 中的反向引用以及扩展。

例如,-i如果您希望它匹配,请添加该选项。Meme

如果您只想输出匹配的单词(每行一个)而不是包含它们的整行,则无法使用grep.你可以使用perl

perl -Mopen=locale -lne 'print $& while /\S*([[:alpha:]]{2})\S*\1\S*/g'

通过 GNU 实现grep,您应该能够执行相同的操作:

grep -Eo '\S*([[:alpha:]]{2})\S*\1\S*'

相关内容