grepは、同じ単語で2回現れる文字のペアを探します。

grepは、同じ単語で2回現れる文字のペアを探します。

同じ単語に2回現れる文字のペアを持つ単語を見つける正しい表現は何ですか?これは私が使っている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

編集する:

あなたの質問をもう一度読んで、私は「二度」を読んだことに気づきました。同じ言葉を使う入力データには1行に1つの単語しか含まれていないので大丈夫ですが、関連するテストケースを含めるように質問を変更します。

「同じ単語を2回」使用するには、次のものを使用できます。

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

または、一部のバージョンではgrepショートカットを使用してください。

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

答え3

POSIX的に:

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

2つのアルファベット文字シーケンス、その後に必要な数の文字(スペース文字を除く)、同じアルファベット文字シーケンスを含む行を出力します。

POSIX EREは逆参照をサポートせず、BREのみをサポートします。ただし、一部のgrep実装では、EREと拡張の逆参照をサポートしています。

たとえば、一致-iさせるには適切なオプションを追加します。Meme

一致する単語を含む行全体ではなく、一致する単語(1行に1つずつ)だけを出力したい場合は機能しませgrepperl

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

GNU実装では、grep同じことができます。

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

関連情報