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 plist
e 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 sed
ou awk
(ou com extensões não padrão, grep
como 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 Prototypes
string sempre prefixa exatamente a .plist
string 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