Tengo un archivo 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
Ahora si quiero obtener todas las líneas que terminan en plist
y no contienen la palabra Prototype
. hasta ahora tengo
grep -v "Prototype" fileA.txt | grep -E "*plist$"
Y la salida es
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist
Que es exactamente lo que quiero,
¿Pero hay una mejor manera de hacer esto?
Respuesta1
grep -v Prototype | grep 'plist$'
Probablemente sea tan bueno como parece. Puede hacerlo con un comando con sed
o awk
(o con extensiones no estándar grep
como ya han mostrado otros):
sed '/Prototype/d;/plist$/!d'
O
awk '/plist$/ && ! /Prototype/'
Pero eso no necesariamente será más eficiente.
Respuesta2
Prueba esto
grep -P '^(?!.*Prototype).*plist$' fileA.txt
Respuesta3
Si la Prototypes
cadena siempre antepone exactamente la .plist
cadena como se muestra en su ejemplo, y la versión de grep de su plataforma admite el modo PCRE, puede usar una búsqueda hacia atrás negativa de estilo perl, como por grep -P '(?<!Prototypes)\.plist$'
ejemplo
$ grep -P '(?<!Prototypes)\.plist$' fileA.txt
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist