テキストファイルの任意の行に2つの(指定された)単語が存在するかどうかを確認する必要があります。単語の文字に制限はありません。例えば:
「cat」と「elephant」の2つの単語を一緒に含むテキストファイルの行を検索したい(つまり、同じ行にある。必ずしも並んでいる必要はない):
Cat is smaller than elephant
Elephant is larger than cat
Cats are cute!
Elephants are very strong
Cat and elephants live in different environments
cats are friendly
前の例では、両方の単語を含む行をどのように見つけることができますか?
Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environments
私は希望のないgrepとawkを試しました。問題は、大文字と小文字が混在する単語があるため、文字のステータスに関係なく、両方の単語を一致させるにはどうすればよいですか。
grep
grep -i "cat" file | grep -i "elephant"
Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment
grep
のフラグは大文字と小文字を区別しません(大文字/小文字)
-i, --ignore-case ignore case distinctions
またはawk
awk 'BEGIN{IGNORECASE=1} /cat/&&/elephant/{print $0}' file
@ glenn jackmanは、awk
ステートメントを次のように実行できることを示唆しています。
awk '/cat/&&/elephant/' IGNORECASE=1 file
$ grep -Fiw cat <file | grep -Fiw elephant
Cat is smaller than elephant
Elephant is larger than cat
最初に、Word file
を含むファイルcat
からすべての行を抽出し、次にそれらの行をWord elephant
を含む行に絞り込みます。
これはgrep -F -i -w
どこ
-F
は、パターンを正規表現ではなく固定文字列としてgrep
に処理させます。-i
はgrep
で大文字と小文字を区別しないマッチングを行い、-w
はgrep
を完全な単語のみに一致させます。-w
オプションは grep
のPOSIX標準 の拡張ですが、最も一般的なgrep
実装によって実装されます。基本的に、一致する文字列が長いWordの一部である場合、指定されたパターンの一致を禁止します。
行が一致していないことに注意してください
Cat and elephants live in different environment
これは、s
の最後のelephants
が原因です。私もラインと一致しません
elephantiasis is catastrophic
同じ理由で。
単語の終わりに複数のs
を許可しますか?
$ grep -Eiw 'cats?' <file | grep -Eiw 'elephants?'
Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment
ここでは、grep
の両方の呼び出しで、固定文字列の代わりに(拡張)正規表現を使用しています。式は、2つの単語の末尾にあるオプションのs
に一致します。ここで、cat
とcats
(大文字と小文字を区別せず)に一致しますが、catnip
、catsup
、またはscat
には一致しません。
GNU sed:
sed -n '/cat/I {/elephant/I p}' file
またはPerl
Perl -ne 'print if /cat/i and /elephant/i' file
または単一のgrep
grep -i -e 'cat.*elephant' -e 'elephant.*cat' file