テキストファイルの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 -w
whereを使用して行われます。
-F
grep
パターンが正規表現ではなく固定文字列として扱われるようにします。-i
grep
大文字と小文字を区別せずに一致を実行します。-w
grep
完全な単語だけを一致させます。
この-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
。式は、s
2つの単語の末尾にあるオプションの値と一致します。cat
and 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」の大文字と小文字を区別しない一致です。a
e
i
o
u
[Ee]
E
e
このアプローチ(例:みんなこれまでにここに投稿された他の回答は)行と一致します
できる方法はいくつかあります猫象を確認してください。「という言葉のせいで猫ch"には"cat"という文字列が含まれています。これを防ぐには、次のようにします。
awk '/(^|\W)[Cc][Aa][Tt](\W|$)/ && /(^|\W)[Ee][Ll][Ee][Pp][Hh][Aa ][Nn][Tt](\W|$)/' 文書各単語の前には単語以外の文字(または行の先頭)があり、その後には単語以外の文字(または行の終わり)が続くように制限します。これは、単語以外の文字
\W
(スペースなど)(またはタブ)または他の文字と一致します。英数字ではない *特徴)。
(これがPOSIXと互換性があるかどうかはわかりません。)
これでこれが行われます。いいえマッチ
猫と象は異なる環境で生きていますなぜなら、「象」という言葉は「象」という言葉とは異なるからです。
____________________
* この場合、下線( "_"文字)は1文字と見なされます。