このような入力があります
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
または、grep
Perl と同様の正規表現をサポートする実装を使用します。
$ 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
)。