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или awk(или с нестандартными расширениями, grepкак уже показали другие):

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

Или

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

Но это не обязательно будет эффективнее.

решение2

Попробуй это

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

решение3

Если Prototypesстрока всегда точно предваряет .plistстроку, как показано в вашем примере, и версия grep вашей платформы поддерживает режим PCRE, вы можете использовать отрицательный просмотр назад в стиле Perl, например 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

Связанный контент