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

2

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 obter todas as linhas que terminam com 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

Qual é exatamente o que eu quero,

Mas há uma maneira melhor de fazer isso?

    
por gkmohit 20.06.2014 / 16:44

3 respostas

7
grep -v Prototype | grep 'plist$'

é provavelmente tão bom quanto possível. Você poderia fazer isso com um comando com sed ou awk (ou com extensões não padrão para grep , como outras pessoas já mostraram):

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

Ou

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

Mas isso não necessariamente será mais eficiente.

    
por 20.06.2014 / 17:19
1

Tente isso

grep -P '^(?!.*Prototype).*plist$' fileA.txt
    
por 20.06.2014 / 17:01
0

Se a string Prototypes sempre prefixar exatamente a string .plist , como mostrado no seu exemplo, e a versão do grep da sua plataforma suportar o modo PCRE, você poderia usar uma lookbehind negativa no estilo perl, como grep -P '(?<!Prototypes)\.plist$' eg

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

Tags