So invertieren Sie einen grep-Ausdruck


237

Der folgende grep-Ausdruck listet erfolgreich alle EXE- und HTML-Dateien im aktuellen Verzeichnis und in den Unterverzeichnissen auf.

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

Wie invertiere ich dieses Ergebnis, um diejenigen aufzulisten, die stattdessen keine .html- oder .exe-Datei sind? (Das heißt , !=.)

Antworten:


337

Verwenden Sie die Befehlszeilenoption -voder --invert-match,

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

4
Es ist zu beachten, dass -v/ --invert-matchnicht unbedingt umdreht, ob der Rückkehrcode von grepeine erfolgreiche Ausführung anzeigt, sondern stattdessen mit den Zeilen übereinstimmt, die sonst nicht übereinstimmen würden. Diejenigen, die den Rückkehrcode invertieren möchten (dh erfolgreich sind, wenn nicht alle Zeilen mit dem Muster übereinstimmen, sondern mindestens eine), sollten verwenden ! grep. Dies findet Verwendung in bedingten Ausdrücken, z if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl

98
grep -v

oder

grep --invert-match

Sie können dasselbe auch tun mit find:

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

Mehr Infos hier .


2
Der findBefehl ist die semantischste Lösung für dieses XY-Problem. Kombinieren lsund grepzu diesem Zweck scheint bestenfalls hacky. Dies sollte die akzeptierte Antwort sein. (+1)
Eric Seastrand

4
@Eric Unabhängig von den Anforderungen des OP ist das Invertieren eines grep-Ausdrucks viel mehr als nur das Suchen von Dateien. Ich bezweifle, dass dies der Grund ist, warum die meisten Leute hierher kommen.
Byxor

30

Fügen Sie -vIhrem grepBefehl die Option hinzu, um die Ergebnisse umzukehren.



7

Wie mehrfach angegeben, wird die Inversion durch die -vOption erreicht grep. Lassen Sie mich den (hoffentlich amüsanten) Hinweis hinzufügen, dass Sie dies selbst hätten herausfinden können, indem Sie den Hilfetext durchgesehen haben grep:

grep --help | grep invert

-v, --invert-match wählt nicht übereinstimmende Zeilen aus

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.