У меня есть файл 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