Cómo invertir una expresión grep

237

La siguiente expresión grep enumera correctamente todos los archivos .exe y .html en el directorio y subdirectorios actuales.

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

¿Cómo invierto este resultado para enumerar aquellos que no son .html o .exe en su lugar? (Es decir,. !=)

sMaN
fuente

Respuestas:

337

Use la opción de línea de comandos -vo --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
Eric Fortis
fuente
44
Cabe señalar que -v/ --invert-matchno necesariamente cambiará si el código de retorno de grepindica ejecución exitosa, sino que coincidirá con las líneas que de otro modo no serían coincidentes. Aquellos que buscan invertir el código de retorno (es decir, tener éxito si todas las líneas no coinciden con el patrón, en lugar de al menos uno) deben usar ! grep. Este encuentra uso en expresiones condicionales, por ejemplo: if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl
98
grep -v

o

grep --invert-match

También puede hacer lo mismo usando find:

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

Más información aquí .

darioo
fuente
2
El findcomando es la solución más semántica a este problema XY. Combinar lsy greppara este propósito parece hacky en el mejor de los casos. Esta debería ser la respuesta aceptada. (+1)
Eric Seastrand
44
@Eric Independientemente de los requisitos del OP, invertir una expresión grep es útil para mucho más que buscar archivos. Dudo que esa sea la razón por la que la mayoría de la gente viene aquí.
byxor
30

Agregue la -vopción a su grepcomando para invertir los resultados.

Rob Sobers
fuente
9
 grep "subscription" | grep -v "spec"  
Anja Ishmukhametova
fuente
7

Como se indicó varias veces, la inversión se logra mediante la -vopción de grep. Permítame agregar la nota (con suerte divertida) de que podría haberlo descubierto usted mismo al leer el greptexto de ayuda:

grep --help | grep invert

-v, --invert-match selecciona líneas no coincidentes

jmd_dk
fuente