grep - 文字列で正確に3つのaを見つける正規表現

grep - 文字列で正確に3つのaを見つける正規表現

正規表現が/usr/share/dict/wordsに含まれる単語と一致するように、次のコマンドを変更したいと思います。正確に代わりに3a少なくとも3時

cat /usr/share/dict/words | grep "a.*a.*a" | grep -v "'s$" | wc -l

どうすればいいですか?

答え1

(すべての文字と一致)の代わりに(を[^a]除くすべての文字と一致)を使用する方法は次のとおりです。a.

$ grep -E '^([^a]*a){3}[^a]*$' /usr/share/dict/cracklib-small | shuf -n 4
areaway
humanitarian
capitalizations
autonavigator

このように正規表現を作成して^[^a]*(a[^a]*){3}$同じ結果を得ることもできます。

また、異なる数のaが必要な場合、^[^a]*a[^a]*a[^a]*a[^a]*$サイズ変更は行われません。パフォーマンスははるかに優れていますが、ギガバイトのデータを処理しない限り特に問題はありません。

^正規表現とアンカー演算子を明示的に使用するのではなく、暗黙的にこれを行うオプションを使用することもできます。大文字と小文字を区別しない一致オプションも参照してください(ロケールによって異なります)。$-x-i

grep -xiE '([^a]*a){3}[^a]*'

答え2

同じ種類のパターンを使用して「最小4a秒」を検出し、一致の意味を逆に置き換えます。

grep 'a.*a.*a' /usr/share/dict/words | grep -v 'a.*a.*a.*a'

または、

grep '\(a.*\)\{3\}' /usr/share/dict/words | grep -v '\(a.*\)\{4\}'

または、

grep -E '(a.*){3}' /usr/share/dict/words | grep -v -E '(a.*){4}'

または with をフィールド区切り文字として使用し、フィールド数を計算しますawka

awk -F a 'NF == 4' /usr/share/dict/words

(sが3つある行にはa4つのフィールドがあります)


または、Perlの演算子を使用してtr各行のs数を計算します。a

perl -ne 'print if (tr/a/a/ == 3)' /usr/share/dict/words

この演算子は作成された音域の数を返し、実際の出力が変更されないように各音域をa別の音域に置き換えます。a

関連情報