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

Réponses:


337

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

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

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 .


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.



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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.