Wenn ich ls /directory | grep '[^term]'
in Bash ausführe, erhalte ich eine regelmäßige Auflistung, als würde der grep
Befehl irgendwie ignoriert. Ich habe das Gleiche mit egrep
versucht, ich habe versucht, es mit doppelten und einfachen Anführungszeichen zu verwenden, aber zu keinen besseren Ergebnissen. Wenn ich es versuche, ls /directory | grep '^[term]
bekomme ich alle Einträge, die mit term beginnen - wie erwartet.
Ich habe diesen Befehl in einem Online-Editor ausprobiert, in dem ich meinen regulären Ausdruck testen kann , und er hat so funktioniert, wie er sollte. Aber nicht in Bash. Es funktioniert also in einer Simulation, aber nicht im wirklichen Leben.
Ich arbeite an Crunchbang Linux 10. Ich hoffe, dass dies genug Informationen sind und freue mich auf jeden Hinweis, denn es ist wirklich frustrierend, nicht auf einer so grundlegenden Ebene auszuführen und Stunden Zeit zu verschwenden!
grep
Zeilen beginnen mit Begriff. Oder möchten Sie nach Zeilen suchen, die überhaupt keinen Begriff enthalten?Antworten:
Sind Sie sicher, dass das, was Sie wollen, passiert? Wenn Sie rennen
ls /directory | grep '[^term]'
, suchen Sie im Wesentlichen nicht nach den Buchstaben ter m. Das heißt, wenn eine Datei andere Buchstaben im Namen hat, wird sie weiterhin in der Ausgabe von angezeigtls
. Nehmen Sie zum Beispiel das folgende Verzeichnis:Wenn ich jetzt renne,
ls |grep '^[brav]'
bekomme ich folgendes:Wie Sie sehen können, nicht nur ich
brave
undbravo
ich habe auch ,alpha
weil die Zeichenklasse[]
jeden Buchstaben aus dieser Liste erhalten.Wenn ich folge
ls |grep '[^brav]'
, bekomme ich folglich alle Dateien, die die Zeichen brav irgendwo im Namen enthalten.Wenn Sie bemerken, dass es die gesamte Verzeichnisliste enthält, weil alle Dateien mindestens einen Buchstaben hatten, der nicht in der Zeichenklasse enthalten war.
Also, wie Kanvuanza sagte, um nach der Umkehrung von "Begriff" zu suchen, im Gegensatz zu den Zeichen, die
t e r m
Sie verwenden solltengrep -v
.Zum Beispiel:
Auch wenn Sie nicht möchten, dass Dateien mit Zeichen in der Klasse verwendet werden
grep -v '[term]'
. Dadurch wird verhindert, dass Dateien mit einem dieser Zeichen angezeigt werden. (Kanvuanzas Antwort)Zum Beispiel:
Wie Sie sehen, wurden keine Dateien aufgelistet, da alle Dateien in diesem Verzeichnis mindestens einen Buchstaben aus dieser Klasse enthielten.
Nachtrag:
Ich wollte hinzufügen, dass es mit PCRE möglich ist, nur Regex zu verwenden, um mit negativen Ausdrücken herauszufiltern. Um dies zu tun, würden Sie etwas verwenden, das als negative Vorausschau-Regex bekannt ist :
(?!<regex>)
.Mit dem obigen Beispiel können Sie so etwas tun, um die gewünschten Ergebnisse zu erzielen, ohne
grep
Flags zu verwenden.Um diesen regulären Ausdruck zu dekonstruieren, stimmt er zuerst am Anfang einer Zeile
^
überein und sucht dann nach Zeichenfolgen, die nicht übereinstimmenbrav
, um anschließend zu folgen. Nuralpha
,,charlie
unddelta
übereinstimmen, damit nur diese gedruckt werden.quelle
-v
Option zu sein. Danke für deine Unterstützung! Diese Frage hat meinen Nachmittag wirklich ruiniert, wo Ihre Antwort meinen Abend erhellt!negative look-ahead regex
.Ich denke, diese
grep -v
Flagge macht, was Sie wollen. Von der Manpage :Sie können
ls /directory | grep -v [term]
damit nicht übereinstimmende Zeilen drucken.quelle
[^abc]
Aber ich bin mir ziemlich sicher, dass grep keine Klassenverneinungen unterstützt, außer ein paar Standardnegationen (z. B.[[:^digits:]]
). Grep-Unterstützung für Verneinung ist schrecklich !grep
der Umgang mit Zeichenklassen ist in Ordnung. Es bedeutet nur etwas ganz anderes als das, was Sie (falsch) verstehen.[abc]
bedeutet einen vona
,b
, oderc
;[^abc]
bedeutet alles andere als das oben genannte. Es ist ein Charakter.