Linuxでは、各単語に2つの同じ文字を含む行を印刷します。

Linuxでは、各単語に2つの同じ文字を含む行を印刷します。

このような入力があります

LTCYMM SVNNDA DTVEV QLOPGO CUPUR
MMWVJM LIVLI WBSVD UQCMW HBMDA HVVFY BWYSS
NOGWOS JIKKDI GCIQAD MXJNWE SMVFCB GIZVPA GZOHZR WJBMZS
KKPQBP BKDKRU ZTPDPL ZRLUEL HRZZKO KXSKCU YZQTBT RISNKS
VYQQC BFAWI NSZDV HKPGI KVJOC COPPS
JGU YLN MXW ACR BZA HOP
TMCVPT HBNGIH IQYGCI DTQPON WXANKG GMIYZS
CWVT BUBA NSGR MUPO LDNS

各単語に含まれる行を印刷しようとしています。同じ文字が2つ以上ある必要があります。、grepを使用すると、command 最も長い行に8単語が含まれます。こうすれば解決できると思いましたが、方法が間違っているようです。

grep '^.*\([A-Z]\)[^ ]*\1[^ ]* [^ ]*\([A-Z]\)[^ ]*\2[^ ]*   [^ ]*\([A-Z]\)[^ ]*\3[^ ]* [^ ]*\([A-Z]\)[^ ]*\4[^ ]* [^ ]*\([A-Z]\)[^ ]*\5[^ ]* [^ ]*\([A-Z]\)[^ ]*\6[^ ]* [^ ]*\([A-Z]\)[^ ]*\7[^ ]* [^ ]*\([A-Z]\)[^ ]*\8[^ ]*$/| .... for 7 words | for 6 ...

期待される出力

 LTCYMM SVNNDA DTVEV QLOPGO CUPUR
 KKPQBP BKDKRU ZTPDPL ZRLUEL HRZZKO KXSKCU YZQTBT RISNKS

ベストアンサー1

そしてperl

$ perl -ne 'print unless grep {!/(.).*\1/} /\S+/g' file
LTCYMM SVNNDA DTVEV QLOPGO CUPUR
KKPQBP BKDKRU ZTPDPL ZRLUEL HRZZKO KXSKCU YZQTBT RISNKS

または、grepPerl と同様の正規表現をサポートする実装を使用します。

$ grep -Pve '(?<!\S)(?!\S*(\S)\S*\1)\S' file
LTCYMM SVNNDA DTVEV QLOPGO CUPUR
KKPQBP BKDKRU ZTPDPL ZRLUEL HRZZKO KXSKCU YZQTBT RISNKS

印刷された行いいえ( -v)\Sには、空白以外の文字 ( ) が前に来ず(?<!\S)(または IOW は空白で区切られた単語の先頭である)、次の空白ではない文字シーケンスの先頭ではない(空白ではない文字)が含まれています。 ((?!\S*(\S)\S*\1))が繰り返されます。したがって、perl上記のアプローチと本質的に似ています(あまり明確ではありません)。

また、空白行も印刷することに注意してください(繰り返し文字がない単語は含まれていないため)。必要でない場合は除外できます。これは簡単です(例:-e '^\s*$'そこに追加grep)。

おすすめ記事