grep を使用して、正規表現でグループ化されたすべての行を検索します。

grep を使用して、正規表現でグループ化されたすべての行を検索します。

したがって、ドキュメントには次の形式の文字列が含まれます。

9s5s4sKs7h6h4h2d4dAdTd2c3c
6hKhQs6s3s7s5d3d2d9dKdAd4h
5s9sTs8hKhJc4s6c4hJsAc2dKs

各行は、数字/大文字と小文字のペアで構成されています。

同じ小文字(Ksや2dなど)を持つグループペア(互いに隣り合う)を持つすべての行を見つけたいです。したがって、最初の行で「s」を持つペアはすべて互いに隣り合い、「h」ペア、「d」、「c」の順になります。

可能な小文字は 4 つ (s, c, d, h) だけなので、次の正規表現を作成しました。

^.(.)(.\1)*.(.)(.\3)*.(.)(.\5)*.(.)(.\7)* .*$

しかし、それは次の行を説明しません。

6hKhQs6s3s7s5d3d2d9dKdAd4h

最初は「h」のペアがあり、次に別のペアがあり、最後に「h」のペアがあります。したがって、この行は一致しないでください。

これにはgrepコマンドを使用します。

例:

grep -P "^.(.)(.\1)*.(.)(.\3)*.(.)(.\5)*.(.)(.\7)* .*$" file.txt

入力する:

9s5s4sKs7h6h4h2d4dAdTd2c3c 
6hKhQs6s3s7s5d3d2d9dKdAd4h
5s9sTs8hKhJc4s6c4hJsAc2dKs

出力:

9s5s4sKs7h6h4h2d4dAdTd2c3c

この行には最初に「s」ペアがあり、次に「h」ペア、「d」ペア、最後に「c」ペアがあります。

6hKhQs6s3s7s5d3d2d9dKdAd4h最初に「h」ペアセットがあり、別のペアがあり、最後に別の「h」ペアがあるため、行は一致しません。これは、互いにグループ化されておらず、行が一致しないことを意味します。

ベストアンサー1

文字はに制限されているため、scdh同じ文字が2回表示される場合は、次の文字を使用して異なる文字を含む行をフィルタリングできます。

grep -ve 's.*[cdh].*s' -e 'c.*[sdh].*c' -e 'd.*[sch].*d' -e 'h.*[scd].*h'

あるいは、可能であれば、Perlに似た正規表現を使用してください。

grep -Pv '([scdh]).*(?!\1)[scdh].*\1'

ここではASCIIの[a-z]代わりに小文字を使用できます。[scdh]またはすべてのアルファベットの小文字を[[:lower:]]表します。\p{Ll}

おすすめ記事