Steigern Sie Ihre Produktivität im Linux-Terminal, indem Sie diese erweiterte Suchsyntax lernen

- Was ist Regex?
- Die verschiedenen Varianten von Regex
- Ein schneller Überblick über Regex, um jegliches Mysterium zu beseitigen
- Das DOTALL-Metazeichen: Alles und jedes abgleichen
- Zeichenklassen: Spezifische Zeichen in beliebiger Reihenfolge abgleichen
- Übereinstimmungsgruppen: Grenzen um Teil-Ausdrücke ziehen
- Quantifizierer: Wie man genaue und variable Mengen angibt
- Übereinstimmung von so viel oder so wenig, wie Sie möchten, mit faulen und gierigen Quantifizierern
- Anker stimmen mit Anfang und Ende von Zeilen überein
- Modifizierer: Flags, die ändern, wie Regex funktioniert
- Alles Zusammenführen: Regex Mit Befehlen Verwenden
Regex verbessert die Dateisystemsuche erheblich, indem es präzise Musterdefinitionen ermöglicht. Lernen Sie die Grundlagen und nutzen Sie leistungsstarke Befehle wie grep und find für effiziente Suchen.
Die Suche in Ihrem Dateisystem kann knifflig sein. Manchmal fällt es Ihnen schwer, spezifisch oder genau zu sein? Oder vielleicht ist es zu chaotisch? Regex kann diese Probleme und mehr lösen. Es ist leistungsstark, universell und flexibel, und die Grundlagen werden Ihnen weit helfen.
Was ist Regex?
Regex ist eine Sprache zum Musterabgleich; sie beschreibt ausdrucksvoll Muster, die mit Zeichenfolgen (z. B. Wörtern oder Sätzen) übereinstimmen. Angenommen, Sie suchen auf Ihrer Festplatte nach einem Bild namens foo, können sich aber nicht erinnern, ob es ein JPEG oder ein PNG ist. Wir können Regex mit fd so verwenden: fd 'foo\.(jpg|png)'.
Viele Programme nutzen Regex zum Suchen, Transformieren und Interagieren mit Text. Beispielsweise grep -E [regex], find -regex [regex] oder fd [regex]. Mit Regex sind Sie sehr präzise.
Regex wird überall verwendet. Die meisten Websites im Internet nutzen es in irgendeiner Form. Regex ist auch in Programmen und Anwendungen verbreitet, wie z. B. ripgrep, Vim, Neovim, Emacs und vielen weiteren.
Die verschiedenen Varianten von Regex
Regex gibt es in verschiedenen Varianten, was im Wesentlichen bedeutet, dass es unterschiedliche Regeln (d. h. Syntax) gibt. Es gibt viele Varianten, aber sie unterscheiden sich nur in kleinen Details. Wenn Sie sich an die Konzepte halten, die ich später behandle, werden sie in den meisten Varianten und Linux-Programmen funktionieren. Sie müssen nicht groß darüber nachdenken.
PCRE (Perl Compatible Regular Expressions) ist die funktionsreichste Variante. Alle Beispiele versuchen, mit PCRE kompatibel zu sein.
Wenn Sie Profi werden, können Sie auf den Wikipedia-Artikel, der Regex-Varianten vergleicht, oder auf eine umfassende Vergleichstabelle für Regex verweisen. Denken Sie daran, dass die Konzepte, die Sie lernen, überall anwendbar sein sollten.
Ein schneller Überblick über Regex, um jegliches Mysterium zu beseitigen
Die folgende Liste führt Sie sanft in gängige Regex-Funktionen ein:
| Konzept | Beschreibung |
|---|---|
| Zeichenklassen | Eine Liste spezifischer Zeichen, die Sie abgleichen möchten, z. B. [abc]. |
| Übereinstimmungsgruppen | Klammern um verwandte Teile des Ausdrucks, wie Klammern in der Mathematik, z. B. (foo). |
| Modifier | Ändern, wie der Ausdruck funktioniert, z. B. die Groß-/Kleinschreibung. |
| Anker | Definieren den Anfang und das Ende einer Zeichenfolge, z. B. ^foo$. |
| Quantifizierer | Geben die Menge an, z. B. foo+, foo{3} usw. |
| Alternation | Einfach ein Oder-Aussage, z. B. foo|bar. |
| DOTALL-Metazeichen | Entspricht allem, wie ein Platzhalter – es ist einfach ein Punkt. |
Sie werden diese kombinieren, um ein Muster zu beschreiben.
Diese Funktionen gelten im Allgemeinen, wenn Sie sie mit den später erwähnten Befehlsoptionen verwenden. Zum Beispiel grep -P foo.
Das DOTALL-Metazeichen: Alles und jedes abgleichen
Das DOTALL-Metazeichen ist wie ein Platzhalter, da es alles abgleicht. Es ist einfach ein Punkt. Sie werden dies häufig an Orten verwenden, wo es alles abgleichen sollte.
Zeichenklassen: Spezifische Zeichen in beliebiger Reihenfolge abgleichen
Zeichenklassen sind eine Liste von Zeichen, eingeschlossen in eckigen Klammern, die Sie abgleichen möchten. Zum Beispiel gleicht der folgende Ausdruck a, b, z, 1, 2 oder 9 ab:
[abz129]
Dieser Ausdruck entspricht jedem alphanumerischen Zeichen, ob groß oder klein:
[a-zA-Z0-9]
Der Bindestrich (-) hat eine besondere Bedeutung in einer Zeichenklasse, daher müssen Sie ihn, wenn Sie ihn wörtlich abgleichen möchten, zunächst setzen [-a-z] oder ihn maskieren [a-z\-].
Es ist wichtig zu verstehen, dass eine Zeichenklasse genau ein Zeichen abgleicht, es sei denn, Sie verwenden einen Quantifizierer (der später behandelt wird).
Wenn Sie sich das Ergebnisfeld im Bild genau ansehen, werden Sie erkennen, dass eine einzige Zeichenklasse mehrere Zeichen abgleicht. Der globale Modus (g) ist dafür verantwortlich. Der globale Modus bedeutet, dass Regex nicht beim ersten Treffer stoppt, sondern weitergeht und mehrere Übereinstimmungen erstellt.
Übereinstimmungsgruppen: Grenzen um Teil-Ausdrücke ziehen
In mancher Hinsicht passt das.
Gruppen sind ähnlich wie Klammern in der Mathematik. Wenn Sie beispielsweise einen mathematischen Ausdruck wie 1 + (2 / 2) schreiben, unterscheidet sich der von (1 + 2) / 2. Die Berechnung beginnt mit den innersten Klammern, was das Ergebnis verändert.
Klammern in Regex wirken wie Grenzen; sie gruppieren Teile des Ausdrucks. Zum Beispiel ist foo(bar|baz) nicht dasselbe wie foobar|baz, da ersteres foobar oder foobaz übereinstimmt; letzteres stimmt mit foobar oder baz überein.
Quantifizierer: Wie man genaue und variable Mengen angibt
Quantifizierer ermöglichen es uns, Mengen zu definieren. Wenn wir ein Zeichen mit DOTALL oder Zeichengruppen abgleichen, verwenden wir Quantifizierer, um zu sagen, wie viele. Wir können Quantifizierer auch auf Gruppen anwenden, sodass wir Mengen für gesamte Ausdrücke definieren können.
Übereinstimmung von Null oder mehr Dingen mit dem Sternchen
Das Sternchen (*) Metazeichen stimmt mit null oder mehr Dingen überein. Das Folgende stimmt mit a, b, z oder einem leeren String überein:
[abz]*
Übereinstimmung von einem oder mehr Dingen mit dem Pluszeichen
Das Pluszeichen (+) Metazeichen stimmt mit einem oder mehr Dingen überein. Das Folgende stimmt mit einem oder mehr a-, b- oder z-Zeichen überein:
[abz]+
Dinge mit dem Fragezeichen optional machen
Das Fragezeichen (?) Metazeichen macht das vorherige Element optional. Das Folgende stimmt genau mit einem a, b, z oder gar nichts überein:
[abz]?
Definiere genaue Mengen mit geschweiften Klammern
Geschweifte Klammern ermöglichen es uns, eine genaue Anzahl zu definieren. Zum Beispiel stimmt das Folgende genau zweimal mit a, b oder z überein:
[abz]{2}Das Folgende stimmt mit a, b oder z zwischen 2 und 4 Mal überein:
[abz]{2,4}Eine Zusammenfassung der Quantifizierer
- ?: Optional.
- *: Null oder mehr (null bedeutet ein leerer String).
- +: Eins oder mehr.
- {n,m}: Übereinstimmung zwischen n und m Elementen.
Die Pluszeichen (+) und Fragezeichen (?) Metazeichen funktionieren nicht mit den meisten Linux-Dienstprogrammen, es sei denn, Sie verwenden die entsprechenden Befehlsflaggen. Flaggen werden später behandelt.
Übereinstimmung von so viel oder so wenig, wie Sie möchten, mit faulen und gierigen Quantifizierern
Einige Quantifizierer ermöglichen es uns, eine unbestimmte Menge zu definieren. Zum Beispiel bedeutet das Pluszeichen (+) eins oder mehr – alles, was größer als 0 ist. Die Metazeichen Plus (+) und Sternchen (*) sind standardmäßig gierig, was bedeutet, dass sie versuchen, so viel wie möglich übereinzustimmen. Im Gegensatz dazu können wir sie faul machen, sodass sie so wenig wie möglich übereinstimmen.
Das Hinzufügen eines Fragezeichens (?) macht sie faul. Zum Beispiel stimmt das Folgende mit a, b oder z überein, aber es wird nach der ersten Übereinstimmung stoppen (es ist faul).
[abz]+?
Das Sternchen (*) Metazeichen ist ähnlich, mit einer kleinen Ausnahme: Es stimmt mit null oder mehr Elementen überein. Die faulste mögliche Übereinstimmung ist null, daher wird das Folgende mit nichts übereinstimmen.
[abz]*?
Die Verwendung eines faulen Quantifizierers kann performanter sein, da nicht der gesamte String verarbeitet werden muss. Wenn Sie Millionen von Strings durchsuchen, kann das Übereinstimmen nur mit den ersten wenigen Zeichen viel Zeit und Ressourcen sparen.
Anker stimmen mit Anfang und Ende von Zeilen überein
Anker sind einfach zu verstehen. Es gibt zwei, einer zeigt den Beginn einer Zeile (^) an und einer zeigt das Ende ($) an. Das folgende Muster stimmt genau mit foo und nichts anderem überein:
^foo$
Modifizierer: Flags, die ändern, wie Regex funktioniert
Modifizierer sind eine Möglichkeit, zu ändern, wie Regex funktioniert. Zum Beispiel können wir es groß-/kleinschreibungssensibel machen. Wir haben bereits den globalen Modifizierer betrachtet, aber es ist erwähnenswert, dass er typischerweise am Ende eines Ausdrucks steht.
Der globale Modifizierer
Der globale Modifizierer (g) ermöglicht es Regex, nach Übereinstimmungen zu suchen, nachdem die erste gefunden wurde, was zu mehreren Übereinstimmungen führt. Im Gegensatz dazu stoppt das Deaktivieren des globalen Modifizierers, nachdem die erste Übereinstimmung gefunden wurde.
Der Modifizierer für Groß-/Kleinschreibung
Der Modifizierer für Groß-/Kleinschreibung (i) stimmt sowohl mit Groß- als auch mit Kleinbuchstaben ab, wenn er aktiv ist.
Der Mehrzeilenmodifizierer
Anker definieren den Anfang (^) und das Ende ($) eines Strings. Wenn der Mehrzeilenmodifizierer (m) aktiv ist, stimmen die Anker mit dem Anfang und dem Ende jeder Zeile überein. Wenn er inaktiv ist, stimmen die Anker mit dem gesamten String überein.
So verhalten sich die Anker, wenn der Mehrzeilenmodus aktiv ist:
^foo$ ^bar$
Und wenn es inaktiv ist.
inaktiv:
^foo bars$
Um alle Zeilen zu evaluieren, wenn der Multiline-Modifikator (m) aktiv ist, müssen Sie auch den globalen Modifikator (g) aktivieren. Aber bedenken Sie, dass dies auch mehrere Übereinstimmungen erzeugt.
Alles Zusammenführen: Regex Mit Befehlen Verwenden
Jetzt zum großen Finale: Wie setzen wir das Gelernte sinnvoll ein? Wie zu Beginn erwähnt, unterstützen find, fd, grep, ripgrep und sed alle Regex. Achten Sie auf die von mir verwendeten Befehlsflags; ich habe sie so gewählt, dass sie ähnliche Varianten verwenden.
Für jeden Befehl werde ich den folgenden Ausdruck verwenden:
^.+/[fo]+\.(jpg|png)$
Dieses Muster entspricht einem POSIX-Pfad für eine JPG- oder PNG-Datei. Zum Beispiel:
/foo/bar/baz/foo.jpg
Dieser Ausdruck deckt alles ab, was wir gelernt haben: Anker, Zeichenklassen, Quantifizierer, Alternation, Übereinstimmung von Gruppen und das DOTALL-Metazeichen. Hier ist eine Zusammenfassung des Ausdrucks (in der Reihenfolge des Auftretens):
| Segment | Hinweis |
|---|---|
| ^ | Entspricht dem Anfang der Zeile. |
| .+ | Entspricht jedem Zeichen, ein oder mehrere Male. |
| / | Entspricht einem Vorwärtsschrägstrich direkt vor dem Dateinamen. Dieser literale Slash definiert eine klare Grenze für unseren Dateinamen, und das vorherige DOTALL entspricht allen anderen Pfadzeichen (einschließlich Schrägstrichen). |
| [fo]+ | Entspricht den Buchstaben f und o ein oder mehrere Male, z.B. fo, foo, ffoo, fffooo, fofofof. |
| \. | Entspricht einem literalen Punkt (nicht einem DOTALL). |
| (jpg|png) | Eine Übereinstimmungsgruppe; ich habe sie hier verwendet, um diese beiden Muster zusammenzufassen. Das Pipe-Symbol wird als Alternation bezeichnet, und es in dieser Form zu verwenden bedeutet jpg oder png. |
| $ | Entspricht dem Ende der Zeile. |
Ich werde alle Ausdrücke gegen eine Datei (mit dem Namen Beispiele) mit den folgenden Inhalten abgleichen:
/foo/bar/baz/foo.jpg /one/two/thr/foo.png /this/should/not/match.jpg
Für die Suchbefehle werde ich solche Dateien in meinem Dateisystem erstellen und nach ihnen suchen.
Grep Mit Regex Verwenden
Für grep müssen wir das -P-Flag verwenden, das dessen (eingeschränkte) PCRE-Engine aktiviert. PCRE ist die umfangreichste Variante und unterstützt fast jede Funktion, die Sie sich vorstellen können.
Wenn Sie mit grep nicht vertraut sind, sehen Sie sich diesen detaillierten Leitfaden an, wie Sie es verwenden.
Find Mit Regex Verwenden
Der find-Befehl unterstützt mehrere Regex-Varianten. Sie können eine Liste davon mit folgendem Befehl anzeigen:
find -regextype help
Die Variante, die am nächsten an PCRE herankommt, ist posix-extended, auch bekannt als POSIX ERE (Erweiterte Reguläre Ausdrücke). POSIX ERE fehlen viele erweiterte Funktionen, aber es unterstützt alle Funktionen, die wir behandelt haben.
Wenn dieser Befehl langwierig erscheint, sollten Sie wahrscheinlich ein Alias erstellen, um die Regex-Optionen standardmäßig festzulegen.
Fd Mit Regex Verwenden
Der fd-Befehl verwendet das Regex Rust-Paket (eine Rust-Bibliothek). Das Regex-Paket ist nahezu kompatibel mit PCRE, sodass wir es ohne viel Bedenken verwenden können. Allerdings entspricht fd standardmäßig nur Dateinamen, daher müssen wir das --full-path-Flag verwenden, wenn wir gegen den gesamten Dateipfad übereinstimmen wollen.
Ripgrep Mit Regex Verwenden
Die Verwendung von Regex mit dem ripgrep-Befehl ist einfach, da es das Regex Rust-Paket verwendet. Wie bereits erwähnt, stimmt das Rust-Paket eng mit PCRE überein.
Sed Mit Regex Verwenden
Der sed-Befehl unterscheidet sich von den anderen; er erlaubt es uns, Zeichenfolgen zu suchen und zu ersetzen. Wenn Sie damit nicht vertraut sind, sollten Sie diesen großartigen Leitfaden zur Verwendung des sed-Befehls überprüfen. Die allgemeine Form des Befehls ist wie folgt:
s/pattern/replacement/
Es ist nicht erforderlich, Vorwärtsschrägstriche zu verwenden, da Sie jedes gewünschte Zeichen verwenden können. Im folgenden Beispiel habe ich das Pipe-Zeichen anstelle von Vorwärtsschrägstrichen verwendet, damit ich sed nicht verwirre. Die Verwendung eines Pipes bedeutet, dass ich die Vorwärtsschrägstriche im angegebenen Ersetzungswert (ein Pfad) nicht entkommen muss.
Für sed müssen wir die GNU ERE Regex-Variante verwenden, und das tun wir mit dem -E-Flag. Alles, was in GNU ERE funktioniert, funktioniert auch in PCRE, was gut für uns ist.
Im Beispiel habe ich die Ergebnisse extrahiert und ersetzt.
Dateipfade, ähnlich wie bei cat und grep, aber sed unterstützt auch die Bearbeitung vor Ort mit dem -i-Flag.
Das sind die Grundlagen von Regex. Diese Grundlagen werden Sie sehr weit bringen. Wichtig ist, sich daran zu erinnern, dass viele Dienstprogramme unterschiedliche Regex-Varianten verwenden. Wenn Sie von den genannten Flags abweichen, kann es sein, dass einige Funktionen nicht richtig funktionieren.
Außerdem müssen Sie sich mit Regex auseinandersetzen, bevor es wirklich Sinn macht. Sie können Ihre Fähigkeiten üben, Einblicke gewinnen und mehr lernen über regex101, einen leistungsstarken Online-Spielplatz, der Tipps und Anleitung bietet.
Bist du neugierig auf weitere Artikel wie Steigern Sie Ihre Produktivität im Linux-Terminal, indem Sie diese erweiterte Suchsyntax lernen? Entdecke spannende Inhalte in der Kategorie Linux.

Schreibe einen Kommentar