Como inverter uma expressão grep

237

A seguinte expressão grep lista com êxito todos os arquivos .exe e .html no diretório e subdiretórios atuais.

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

Como inverter este resultado para listar aqueles que não são .html ou .exe? (Ou seja !=,.)

sMaN
fonte

Respostas:

337

Use a opção de linha de comando -vou --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
Eric Fortis
fonte
4
Deve-se notar que -v/ --invert-matchnão necessariamente mudará se o código de retorno grepindica uma execução bem-sucedida, mas corresponderá às linhas que de outra forma não seriam correspondidas. Aqueles que desejam inverter o código de retorno (ou seja, obter êxito se todas as linhas não corresponderem ao padrão, em vez de pelo menos um), devem usar ! grep. Isso encontra usar em expressões condicionais, por exemplo: if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl
98
grep -v

ou

grep --invert-match

Você também pode fazer o mesmo usando find:

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

Mais informações aqui .

darioo
fonte
2
O findcomando é a solução mais semântica para esse problema XY. Combinar lse greppara esse fim parece, na melhor das hipóteses, hacky. Essa deve ser a resposta aceita. (+1)
Eric Seastrand
4
@Eric Independentemente dos requisitos do OP, a inversão de uma expressão grep é útil para muito mais do que encontrar arquivos. Duvido que essa seja a razão pela qual a maioria das pessoas vem aqui.
Bydjr
30

Adicione a -vopção ao seu grepcomando para inverter os resultados.

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

Como declarado várias vezes, a inversão é obtida pela -vopção para grep. Deixe-me acrescentar a nota (que espero que seja divertida) de que você mesmo pode ter descoberto isso através do greptexto de ajuda:

grep --help | grep invert

-v, --invert-match seleciona linhas não correspondentes

jmd_dk
fonte