正規表現が/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 をフィールド区切り文字として使用し、フィールド数を計算しますawk
。a
awk -F a 'NF == 4' /usr/share/dict/words
(sが3つある行にはa
4つのフィールドがあります)
または、Perlの演算子を使用してtr
各行のs数を計算します。a
perl -ne 'print if (tr/a/a/ == 3)' /usr/share/dict/words
この演算子は作成された音域の数を返し、実際の出力が変更されないように各音域をa
別の音域に置き換えます。a