Comment inverser une expression grep

237

L'expression grep suivante répertorie avec succès tous les fichiers .exe et .html du répertoire et des sous-répertoires actuels.

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

Comment inverser ce résultat pour répertorier ceux qui ne sont pas à la place .html ou .exe. (C'est-à-dire !=.)

sMaN
la source

Réponses:

337

Utilisez l'option de ligne de commande -vou --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
Eric Fortis
la source
4
Il convient de noter que -v/ --invert-matchne retournera pas nécessairement si le code de retour grepindique une exécution réussie, mais correspondra plutôt aux lignes qui autrement ne seraient pas mises en correspondance. Ceux qui cherchent à inverser le code retour (c'est-à-dire réussir si toutes les lignes ne correspondent pas au modèle, plutôt qu'au moins un) devraient utiliser ! grep. Ceci trouve utilisation dans des expressions conditionnelles, par exemple: if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl
98
grep -v

ou

grep --invert-match

Vous pouvez également faire la même chose en utilisant find:

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

Plus d'infos ici .

darioo
la source
2
La findcommande est la solution la plus sémantique à ce problème XY. La combinaison lset grepà cette fin semble au mieux hacky. Ce devrait être la réponse acceptée. (+1)
Eric Seastrand
4
@Eric Indépendamment des exigences de l'OP, inverser une expression grep est utile pour bien plus que rechercher des fichiers. Je doute que c'est la raison pour laquelle la plupart des gens viennent ici.
byxor
30

Ajoutez l' -voption à votre grepcommande pour inverser les résultats.

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

Comme indiqué plusieurs fois, l'inversion est obtenue par l' -voption to grep. Permettez-moi d'ajouter la note (j'espère amusante) que vous auriez pu comprendre cela vous-même en parcourant le greptexte d'aide:

grep --help | grep invert

-v, --invert-match sélectionner les lignes non correspondantes

jmd_dk
la source