grepは、特定の単語を持たないすべての行を検索します。

grepは、特定の単語を持たないすべての行を検索します。

fileA.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または とともに 1 つのコマンドを使用してこの操作を実行できます (または他の人がすでに示したように非awk標準拡張を使用 )。grep

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

または

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

しかし、これは必ずしもより効率的ではありません。

答え2

この試み

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

答え3

Prototypes文字列の接頭辞が常に.plist例と正確に一致し、プラットフォームバージョンのgrepがPCREモードをサポートしている場合は、PerlスタイルのネガティブLookBehindルックアップを使用できますgrep -P '(?<!Prototypes)\.plist$'

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

関連情報