grep para todas as linhas que não possuem uma palavra específica

grep para todas as linhas que não possuem uma palavra específica

Eu tenho um arquivo 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

Agora, se eu quiser pegar todas as linhas que terminam pliste não contém a palavra Prototype. Até agora eu tenho

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

E a saída é

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

Que é exatamente o que eu quero,

Mas existe uma maneira melhor de fazer isso?

Responder1

grep -v Prototype | grep 'plist$'

é provavelmente o melhor que existe. Você poderia fazer isso com um comando com sedou awk(ou com extensões não padrão, grepcomo outros já mostraram):

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

Ou

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

Mas isso não será necessariamente mais eficiente.

Responder2

Experimente isso

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

Responder3

Se a Prototypesstring sempre prefixa exatamente a .pliststring conforme mostrado no seu exemplo, e a versão do grep da sua plataforma suporta o modo PCRE, você pode usar um lookbehind negativo no estilo perl, como por grep -P '(?<!Prototypes)\.plist$'exemplo

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

informação relacionada