特定の単語を含まないすべての行をgrepで検索する

特定の単語を含まないすべての行をgrepで検索する

ファイルA.txtがあります

Batman.plist
Green Arrow.plist
Hawkgirl.plist
EOPrototypes.plist
Person.plist
EOPrototypes.plist
EOJavellinPrototypes.plist
Sinestro
Slomon Grundy.plist
Batman Beyond.plist
EORedRobin
EORavenPrototypes.plist

plistここで、 で終わり、 という単語を含まないすべての行を取得したいとしますPrototype。これまで私は

grep -v "Prototype" fileA.txt | grep -E "*plist$"

そして出力は

Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist

それはまさに私が望んでいることです

しかし、これを行うより良い方法はあるのでしょうか?

答え1

grep -v Prototype | grep 'plist$'

sedおそらくこれが一番良いでしょう。または(または他の人が既に示しているようawkに の非標準拡張)を使用した 1 つのコマンドで実行できます。grep

sed '/Prototype/d;/plist$/!d'

または

awk '/plist$/ && ! /Prototype/'

しかし、それが必ずしもより効率的になるとは限りません。

答え2

これを試して

grep -P '^(?!.*Prototype).*plist$' fileA.txt

答え3

Prototypes文字列が常に.plist例のように文字列の先頭に正確に付加され、プラットフォームのgrepのバージョンがPCREモードをサポートしている場合は、例えばgrep -P '(?<!Prototypes)\.plist$'次のようなperlスタイルの否定後読みを使用できます。

$ grep -P '(?<!Prototypes)\.plist$' fileA.txt
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist

関連情報