web-dev-qa-db-ja.com

指定した2つの単語を含むすべての行を検索するにはどうすればよいですか?

テキストファイルの任意の行に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を試しました。問題は、大文字と小文字が混在する単語があるため、文字のステータスに関係なく、両方の単語を一致させるにはどうすればよいですか。

5
user315982

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
7
user88036
$ 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に処理させます。
  • -igrepで大文字と小文字を区別しないマッチングを行い、
  • -wgrepを完全な単語のみに一致させます。

-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に一致します。ここで、catcats(大文字と小文字を区別せず)に一致しますが、catnipcatsup、またはscatには一致しません。

6
Kusalananda

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
3
glenn jackman