ファイル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