Website-Suche

Bash-Regexps für Anfänger mit Beispielen


Die Verwendung regulärer Ausdrücke in Bash bietet Ihnen viel Leistung, um nahezu jede erdenkliche Textzeichenfolge (oder sogar ganze Dokumente) zu analysieren und in nahezu jede gewünschte Ausgabe umzuwandeln. Wenn Sie Bash regelmäßig verwenden oder regelmäßig mit Listen, Textzeichenfolgen oder Dokumenten in Linux arbeiten, werden Sie feststellen, dass viele Aufgaben vereinfacht werden können, indem Sie lernen, wie reguläre Ausdrücke in Bash verwendet werden. Lesen Sie weiter, um grundlegende Bash-Fähigkeiten für reguläre Ausdrücke zu erlernen! Wenn Sie bereits mit grundlegenden regulären Ausdrücken in Bash oder einer anderen Programmiersprache vertraut sind, sehen Sie sich unsere erweiterten regulären Bash-Ausdrücke an. Wenn nicht, lesen Sie weiter, um grundlegende Bash-Fähigkeiten für reguläre Ausdrücke zu erlernen!

In diesem Tutorial lernen Sie:

  • So verwenden Sie reguläre Ausdrücke auf der Befehlszeile in Bash
  • Wie reguläre Ausdrücke jede Textzeichenfolge und/oder jedes Dokument analysieren und transformieren können
  • Grundlegende Anwendungsbeispiele für reguläre Ausdrücke in Bash

Bash-Regexps für Anfänger mit Beispielen

Verwendete Softwareanforderungen und Konventionen

Beispiel 1: Unser erster regulärer Ausdruck

Es gibt mehrere gängige Befehlszeilenprogramme wie sed und grep, die Eingaben mit regulären Ausdrücken akzeptieren. Und Sie müssen auch keine Änderungen am Tool vornehmen (verwenden oder einrichten), um reguläre Ausdrücke verwenden zu können. Sie sind standardmäßig Regex-fähig. Schauen wir uns ein Beispiel ohne Regex an, bei dem wir zuerst abc in xyz ändern:

echo 'abc' | sed 's/abc/xyz/'
xyz

Hier haben wir echo verwendet, um den String abc auszugeben. Als nächstes übergeben wir die Ausgabe dieses Echos (mit dem Pipe-Zeichen, d.h. |, Zeichen) an das Dienstprogramm sed. Sed ist ein Stream-Editor zum Filtern und Transformieren von Text. Ich empfehle Ihnen, das detaillierte Handbuch zu lesen, indem Sie man sed in die Befehlszeile eingeben.

Nach der Übergabe an sed transformieren wir die Zeichenkette mithilfe einer sed-spezifischen (und regex-fähigen) Syntax. Der Befehl, den wir an sed übergeben (nämlich s/abc/xyz/), kann auch als Ersatz für abc mit wyz gelesen werden. Das s steht für substitute, und das Trennzeichen (/ in unserem Fall) gibt an, wo ein Abschnitt des Befehls endet und/oder ein anderer beginnt. Beachten Sie, dass wir auch andere Trennzeichen in sed verwenden können, wie |, wie wir in späteren Beispielen sehen werden.

Lassen Sie uns nun diesen Befehl in ein Beispiel für einen regulären Ausdruck umwandeln.

echo 'abc' | sed 's/./xyz/g'
xyzxyzxyz

Wow, was ist hier passiert? 🙂

Wir haben ein paar kleine Änderungen vorgenommen, die sich erheblich auf die resultierende Ausgabe ausgewirkt haben. Zuerst haben wir abc in der sed-Befehlszeile auf .. Dabei handelt es sich nicht um einen regulären/wörtlichen Punkt, sondern um einen Punkt mit regulärem Ausdruck. Und im regulären Ausdruck bedeutet ein Punkt ein beliebiges Zeichen. Die Dinge sollten jetzt klarer aussehen, vor allem, wenn man die andere kleine Änderung bemerkt, die wir vorgenommen haben: g. Der einfachste Weg, g als global zu betrachten, ist; ein sich wiederholendes Suchen und Ersetzen.

Beachten Sie auch hier, dass s unser eigentlicher sed-Befehl ist, gefolgt von den Optionen für diesen Befehl (die beiden von-bis-Ersetzungstexte), und das g ein Qualifikator über dem Befehl ist. Wenn Sie dies gut verstehen, können Sie gleichzeitig die sed-Syntax lernen.

Im Gegensatz zu unserem ersten Beispiel für einen nicht-regulären Ausdruck und in natürlicher Sprache kann dieser neue Befehl so gelesen werden, dass er ein beliebiges einzelnes Zeichen durch xyz ersetzt, und zwar wiederholt ("global"), bis Sie das Ende der Zeichenfolge erreichen. Mit anderen Worten, a wird in xyz geändert, b wird in xyz geändert usw., was zur dreifachen Ausgabe von xyz führt.

Alles an Bord? Großartig! Sie haben gerade gelernt, wie man reguläre Ausdrücke verwendet. Lassen Sie uns weiter eintauchen.

Beispiel 2: Eine kleine Einschränkung

echo 'abc' | sed 's|\.|xyz|g'
abc

Hoppla. Was ist passiert? Wir haben ein paar kleinere Änderungen vorgenommen, und die Ausgabe hat sich erheblich geändert, genau wie in unserem vorherigen Beispiel. Reguläre Ausdrücke sind sehr leistungsfähig, wie Sie hier sehen können, und selbst eine kleine Änderung kann einen großen Unterschied in der Ausgabe machen. Daher ist es in der Regel notwendig, Ihre Ausdrücke gut zu testen. Und obwohl dies hier nicht der Fall ist, ist es auch sehr wichtig, immer zu berücksichtigen, wie die Ausgabe regulärer Ausdrücke durch unterschiedliche Eingaben beeinflusst werden kann. Oft führt eine leicht veränderte oder modifizierte Eingabe zu einer ganz anderen (und oft fehlerhaften) Ausgabe.

Wir haben zwei kleinere Punkte geändert; Wir haben ein \ vor den Punkt gesetzt und die Trennzeichen von / in |. Die letztere Änderung machte absolut keinen Unterschied, wie wir an dieser Ausgabe sehen können;

echo 'abc' | sed 's|.|xyz|g'
xyzxyzxyz

Und wir können unsere bisherigen Ergebnisse mit diesem Befehl überprüfen:

echo 'abc' | sed 's/\./xyz/g'
abc

Wie erwartet machte die Änderung | to / keinen Unterschied.

Also zurück zu unserem Dilemma – sollen wir sagen, dass die kleine Änderung des Hinzufügens von \ schuld ist? Aber ist es wirklich ein Fehler?

Nein. Was wir mit dieser einfachen Änderung getan haben, ist, den . Punkt in einen wörtlichen (\.) Punkt zu verwandeln. Mit anderen Worten, dies ist kein echter regulärer Ausdruck mehr, sondern eine einfache textuelle Zeichenfolgenersetzung, die als Ersatz für einen beliebigen Literalpunkt in xyz gelesen werden kann, und zwar wiederholt.

Lassen Sie uns das beweisen;

echo 'ab..c' | sed 's/\./xyz/g'
abxyzxyzc

Dies ist wie erwartet: Die beiden Literalpunkte wurden einzeln (aufgrund der sich wiederholenden Natur des g-Qualifizierers) in xyz geändert, was insgesamt abxyzxyzc ergibt.

Super! Lassen Sie uns jetzt ein bisschen mehr ausweiten.

Beispiel 3: Bring it on

Es gibt nichts Schöneres, als kopfüber einzutauchen, oder? Vielleicht. Bis Sie das sehen;

echo 'a..b..c' | sed 's|[\.b]\+|d|g;s|[a-c]|d|g'
ddd

Ja, zu komplex, zumindest auf den ersten Blick. Beginnen wir mit einer Vereinfachung davon:

echo 'a..b..c' | sed 's|[\.b]\+|d|g;'
adc

Sieht immer noch ein wenig knifflig aus, aber Sie werden es bald verstehen. Wenn also die Eingabezeichenfolge von a.. b.. C können wir – anhand unseres vorherigen Beispiels – sehen, dass wir nach einem buchstäblichen Punkt (\.) suchen. In diesem Fall folgt jedoch b und wird von [ und ] umgeben. Dieser Teil des regulären Ausdrucks ([\.b]) kann als beliebiger Literalpunkt gelesen werden, oder das Zeichen b (bisher nicht repetitiv; d.h. eine einzelne Charta, eine von beiden, passt zu diesem Selektor).

Als nächstes qualifizieren wir dies noch ein wenig, indem wir \+ an dieses Auswahlfeld anhängen. Das \+ gibt an, dass wir nach mindestens einem oder möglicherweise mehreren dieser aufgelisteten Zeichen suchen (Literal dot und b). Beachten Sie, dass die gesuchten Zeichen in beliebiger Reihenfolge direkt nebeneinander stehen müssen.

Zum Beispiel der Text ... b.... bbbb... würde immer noch als einzelnes Vorkommen abgeglichen werden, während ... b... Bbb...... b.b... bb (beachten Sie das Leerzeichen) würde als separate (sich wiederholende) Vorkommen übereinstimmen, und beide (d.h. nicht nur das erste) würden übereinstimmen. Und in diesem Fall würde auf beide aufgrund des g global/repetitive Qualifiers reagiert werden.

Mit anderen Worten, in natürlicher Sprache könnten wir diesen regulären Ausdruck als Ersatz für jede zusammenhängende Folge der Zeichen . und b durch d lesen und dies wiederholt tun.

Können Sie sehen, was passiert? In der Eingabezeichenfolge haben wir .. b.., der mit dem regulären Ausdruck übereinstimmt, da er nur die Zeichen \. und b enthält. Es wird dann durch d ersetzt, was zu ADC führt.

Unser größeres Exemplar sieht jetzt plötzlich einfacher aus. Kommen wir zurück zur Sache:

echo 'a..b..c' | sed 's|[\.b]\+|d|g;s|[a-c]|d|g'
ddd

Wenn ich darüber nachdenke, wie der erste Teil des Befehls sed a.. b.. c in ADC einfügen, können wir uns diesen ADC nun als Eingabe für den zweiten Befehl in der sed vorstellen; s|[a-c]|d|g. Beachten Sie, dass beide sed-Befehle durch ; getrennt sind.

Alles, was passiert, ist, dass die Ausgabe des ersteren als Eingabe für den nachfolgenden Befehl verwendet wird. Dies funktioniert fast immer, obwohl es Zeiten gibt (bei der Verwendung komplexer Text-/Dokumentänderungen), in denen es besser ist, die Ausgabe von einem tatsächlichen sed-Befehl mit einer Bash-Pipe (|) an einen anderen sed-Befehl zu übergeben.

Analysieren des zweiten Befehls (s|[ a-c]|d|g) sehen wir, dass wir eine weitere Auswahlbox haben, die die Buchstaben von a bis c ([a-c])); Das - gibt einen Buchstabenbereich an, der alle Teil der Syntax für reguläre Ausdrücke ist.

Die anderen Teile dieses Befehls sprechen jetzt für sich selbst. Insgesamt kann dieser zweite Befehl also so gelesen werden, dass er ein beliebiges Literalzeichen mit dem Bereich a-c (d. h. a, b oder c) in d ersetzt, und zwar wiederholt. Das Ergebnis ist, dass a, d und c (Ausgabe von adc aus unserem ersten Befehl) in ddd gerendert werden.

Dieser sehr komplexe Befehl sieht jetzt nicht mehr so beängstigend aus, oder? Fassen wir zusammen.

Beispiel 4: Eine Abschiedsnachricht

echo 'have a great day' | sed 's|$| all|;s|y|y to|;s|$|you|;s|to [la]\+|to |g;s|$| all|'

Können Sie das herausfinden? Trinkgeld; $ bedeutet das Zeilenende in regulären Ausdrücken. Der Rest dieses komplexen regulären Ausdrucks basiert auf dem Wissen aus diesem Artikel. Was ist die Ausgabe? Versuchen Sie, es mit einem Blatt Papier herauszufinden, ohne die Befehlszeile zu verwenden. Wenn Sie es getan haben – oder wenn 🙂 nicht, lassen Sie es uns in den Kommentaren unten wissen.

Schlussfolgerung

In diesem Tutorial hatten wir eine Einführung in grundlegende reguläre Ausdrücke, verbunden mit ein paar (augenzwinkernden) fortgeschritteneren Beispielen.

Wenn Sie reguläre Ausdrücke lernen und sich den Code anderer Leute ansehen, werden Sie reguläre Ausdrücke sehen, die komplex aussehen. Nehmen Sie sich die Zeit, sie herauszufinden, und spielen Sie mit regulären Ausdrücken auf der Befehlszeile herum. Sie werden bald ein Experte sein, und obwohl die Analyse komplexer regulärer Ausdrücke in der Regel notwendig ist (der Verstand eignet sich einfach nicht bereit, so dichte Informationen zu lesen), wird es einfacher werden. Sie werden auch feststellen, dass ein komplex aussehender Regex bei näherer Analyse in der Regel recht einfach aussieht, sobald Sie ihn verstanden haben – genau wie in den obigen Beispielen.

Vielleicht möchten Sie jetzt auch unseren Artikel über reguläre Ausdrücke in Python lesen, da viele der dort bereitgestellten Informationen auch für reguläre Bash-Ausdrücke gelten, obwohl einige der Formatierungsanforderungen etwas anders sind. Es wird Ihr Verständnis von regulären Ausdrücken, deren Verwendung und deren Anwendung in verschiedenen Situationen und Programmiersprachen verbessern. Sobald Sie ein Regex-Experte sind, verblassen die kleinen Trennlinien zwischen Tools und Programmiersprachen in der Regel, und Sie werden dazu neigen, sich an spezifische Syntaxanforderungen für jede Sprache oder jedes Tool zu erinnern, in der Sie arbeiten.

Genießen!

Verwandte Artikel: