同じ単語に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つずつ)だけを出力したい場合は機能しませ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*'