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 !=,.)

Respostas:


337

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

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

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 .


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.



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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.