Ich habe eine Datei 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
Wenn ich nun alle Zeilen abrufen möchte, die mit enden plist
und das Wort nicht enthalten Prototype
, habe ich bisher
grep -v "Prototype" fileA.txt | grep -E "*plist$"
Und die Ausgabe ist
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist
Und das ist genau das, was ich will.
Aber gibt es einen besseren Weg, dies zu tun?
Antwort1
grep -v Prototype | grep 'plist$'
ist wahrscheinlich das Beste, was es gibt. Sie können es mit einem Befehl mit sed
oder tun awk
(oder mit nicht standardmäßigen Erweiterungen, grep
wie andere bereits gezeigt haben):
sed '/Prototype/d;/plist$/!d'
Oder
awk '/plist$/ && ! /Prototype/'
Aber das ist nicht unbedingt effizienter.
Antwort2
Versuche dies
grep -P '^(?!.*Prototype).*plist$' fileA.txt
Antwort3
Wenn der Prototypes
String immer genau dem .plist
String vorangestellt ist, wie in Ihrem Beispiel gezeigt, und die Version von grep Ihrer Plattform den PCRE-Modus unterstützt, könnten Sie einen negativen Lookbehind im Perl-Stil verwenden, wie grep -P '(?<!Prototypes)\.plist$'
z. B.
$ grep -P '(?<!Prototypes)\.plist$' fileA.txt
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist