指定された2つの単語(大文字と小文字を区別しない)を含むすべての行を見つける方法は? [コピー]

指定された2つの単語(大文字と小文字を区別しない)を含むすべての行を見つける方法は? [コピー]

テキストファイルの1行に2つの(指定された)単語があることを確認する必要があります。単語の文字に制限はありません。たとえば、

テキストファイルで「cat」と「elephant」という単語の両方を含む行を探したいです(つまり、同じ行にある必要があり、必ず並んでいる必要はありません)。

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

前の例では、これら2つの単語を含む行をどのように見つけますか?

Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environments

grepとawkを試しましたが、希望はありません。問題は、いくつかの単語には大文字と小文字がありますが、文字の状態に関係なく、これら2つの単語をどのように一致させることができるかということです。 ?

答え1

そして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

こんにちはawkステートメントを次のように実行することをお勧めします。

awk '/cat/&&/elephant/' IGNORECASE=1 file

答え2

$ grep -Fiw cat <file | grep -Fiw elephant
Cat is smaller than elephant
Elephant is larger than cat

まず、ファイルからfile単語を含むすべての行を抽出し、それをcat単語を含む行に絞り込みますelephant

これはgrep -F -i -wwhereを使用して行われます。

  • -Fgrepパターンが正規表現ではなく固定文字列として扱われるようにします。
  • -igrep大文字と小文字を区別せずに一致を実行します。
  • -wgrep完全な単語だけを一致させます。

この-wオプションは、次のオプションの拡張です。POSIX規格grepしかし、最も一般的なgrep実装として実装されています。一致する文字列が長い単語の一部である場合、デフォルトでは指定されたパターンの一致は許可されません。

行が合っていないので注意してください

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。式は、s2つの単語の末尾にあるオプションの値と一致します。catand cats(大文字と小文字を区別しない)は一致しますがcatnip、、、またははcatsup一致しませんscat

答え3

GNU sedの使用:

sed -n '/cat/I {/elephant/I p}' file

またはパール

perl -ne 'print if /cat/i and /elephant/i' file

または単一のgrep

grep -i -e 'cat.*elephant' -e 'elephant.*cat' file

答え4

GNU以外の場所でawk 大文字と小文字を区別したくない場合は、「貧しい人々の」トリックを使用できます。

awk '/[Cc][Aa][Tt]/ && /[Ee][Ll][Ee][Pp][Hh][Aa][Nn][Tt]/'  文書
ここで、、、またはいずれかと一致するように、[aeiou]orも一致します。つまり、「e」の大文字と小文字を区別しない一致です。aeiou[Ee]Ee

このアプローチ(例:みんなこれまでにここに投稿された他の回答は)行と一致します

できる方法はいくつかあります象を確認してください。
「という言葉のせいでch"には"cat"という文字列が含まれています。これを防ぐには、次のようにします。
awk '/(^|\W)[Cc][Aa][Tt](\W|$)/ && /(^|\W)[Ee][Ll][Ee][Pp][Hh][Aa ][Nn][Tt](\W|$)/'  文書
各単語の前には単語以外の文字(または行の先頭)があり、その後には単語以外の文字(または行の終わり)が続くように制限します。これは、単語以外の文字 \W(スペースなど)(またはタブ)または他の文字と一致します。英数字ではない *特徴)。

(これがPOSIXと互換性があるかどうかはわかりません。)

これでこれが行われます。いいえマッチ

猫と象は異なる環境で生きています
なぜなら、「象」という言葉は「象」という言葉とは異なるからです。
____________________
* この場合、下線( "_"文字)は1文字と見なされます。

関連情報