Bash Regexps für Anfänger mit Beispielen
- 1337
- 215
- Susanne Stoutjesdijk
Die Verwendung regulärer Ausdrücke in Bash bietet Ihnen viel Kraft, um fast jede denkbare Textzeichenfolge (oder sogar die vollständigen Dokumente) zu analysieren und sie in nahezu jeden wünschenswerten Ausgang umzuwandeln. Wenn Sie Bash regelmäßig verwenden oder regelmäßig mit Listen, Textzeichenfolgen oder Dokumenten in Linux arbeiten, werden Sie feststellen, dass viele Jobs vereinfacht werden können. Lesen Sie weiter, um grundlegende Bash -Fachkenntnisse zu erlernen! Wenn Sie bereits mit grundlegenden regulären Ausdrücken in Bash oder einer anderen Codierungssprache vertraut sind, finden Sie in unseren fortgeschritteneren Bash -regulären Ausdrücken. Wenn nicht, lesen!
In diesem Tutorial lernen Sie:
- So verwenden Sie regelmäßige Ausdrücke in der Befehlszeile in Bash
- Wie reguläre Ausdrücke jede Textzeichenfolge und/oder Dokuments analysieren und verändern können
- Basisnutzungsbeispiele für reguläre Ausdrücke bei Bash
Softwareanforderungen und Konventionen verwendet
Kategorie | Anforderungen, Konventionen oder Softwareversion verwendet |
---|---|
System | Linux-Verteilungsunabhängige |
Software | BASH -Befehlszeile, Linux -basiertes System |
Andere | Die SED -Nützlichkeit wird als Beispielwerkzeug zum Einsatz regelmäßiger Ausdrücke verwendet |
Konventionen | # - Erfordert, dass gegebene Linux -Commands mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden können sudo BefehlUS |
Beispiel 1: Unser erster regulärer Ausdruck
Es gibt mehrere gemeinsame Befehlszeilen -Dienstprogramme wie SED und Grep, die den regulären Ausdruckseingang akzeptieren. Und Sie müssen keine Änderungen im Tool (Verwendung oder Einrichtung) vornehmen, um regelmäßige Ausdrücke zu verwenden. Sie sind standardmäßig regex-bewusst. Schauen wir uns ein Nicht-Regex-Beispiel an, in dem wir uns ändern ABC
hinein xyz
Erste:
$ echo 'ABC' | sed 's/ABC/xyz/' xyz
Hier haben wir Echo verwendet, um die Zeichenfolge auszugeben ABC
. Als nächstes übergeben wir die Ausgabe von diesem Echo (mit dem Rohr, ich.e. |
, Charakter) zur SED -Nützlichkeit. SED ist ein Stream -Editor zum Filtern und Transformieren von Text. Ich ermutige Sie, das detaillierte Handbuch durch Eingabe zu überprüfen Mann sed
in der Befehlszeile.
Sobald wir an SED übergeben wurden, transformieren wir die Schnur, indem wir eine SED-spezifische (und regex-bewusste) Syntax verwenden. Der Befehl, den wir an SED übergeben (nämlich S/ABC/XYZ/
) kann auch als gelesen werden als Ersetzen Sie ABC durch Wyz
. Der S
steht für Ersatz und den Separatorcharakter (/
in unserem Fall) gibt an, wo ein Abschnitt des Befehls endet und/oder ein anderer beginnt. Beachten Sie, dass wir auch andere Separatorzeichen in SED verwenden können, wie |
, Wie wir in späteren Beispielen gesehen werden.
Ändern wir diesen Befehl nun in ein reguläres Ausdrucksbeispiel.
$ echo 'ABC' | sed 's/./xyz/g 'xyzxyzxyz
Wow, was ist hier passiert? 🙂
Wir haben ein paar kleine Änderungen vorgenommen, die die daraus resultierende Ausgabe erheblich beeinflusst haben. Erstens haben wir getauscht ABC
in der SED -Befehlszeile zu .
. Dies ist kein regulärer/wörtlicher Punkt, sondern ein regelmäßiger Expressionspunkt. Und im regelmäßigen Ausdruck bedeutet ein Punkt Jeder Charakter. Die Dinge sollten jetzt klarer aussehen, besonders wenn Sie die andere kleine Änderung bemerken, die wir vorgenommen haben: G
. Der einfachste Weg, darüber nachzudenken G
ist als global
; eine sich wiederholende Suche und Ersetzen.
Beachten Sie auch hier wie S
ist unser tatsächlicher SED-Befehl, gefolgt von den Optionen für diesen Befehl (die beiden von Ersatztexten) und die G
ist ein Qualifikationsspiel über den Befehl. Wenn Sie dies gut verstehen, können Sie gleichzeitig SED -Syntax lernen.
Im Gegensatz zu unserem Beispiel für nicht-reguläre Expression und in der natürlichen Sprache kann dieser neue Befehl gelesen werden Ersetzen Sie einen Any-Single-Charakter mit xyz
, und wiederholt ("global"), bis Sie das Ende der Zeichenfolge erreichen. Mit anderen Worten, A
wird geändert in xyz
, B
wird geändert in xyz
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 tauchen.
Beispiel 2: Eine kleine Einschränkung
$ echo 'ABC' | sed 's | \.| xyz | g 'ABC
Hoppla. Was ist passiert? Wir haben ein paar geringfügige Änderungen vorgenommen, und die Ausgabe änderte sich im Wesentlichen, genau wie in unserem vorherigen Beispiel. Regelmäßige Ausdrücke sind sehr leistungsfähig, wie Sie hier sehen können, und selbst eine geringfügige Änderung kann einen großen Unterschied in der Ausgabe bewirken. Daher besteht normalerweise die Notwendigkeit, Ihre Ausdrücke gut zu testen. Und obwohl dies hier nicht der Fall ist, ist es auch sehr wichtig, immer zu überlegen, wie die Ausgabe regulärer Ausdrücke durch unterschiedliche Eingaben beeinflusst werden kann. Oft liefert ein leicht veränderter oder modifizierter Eingang eine ganz andere (und oft fehlerhafte) Ausgabe.
Wir haben zwei kleinere Gegenstände geändert; Wir haben a platziert \
vor dem Punkt, und wir wechselten die Separatoren von /
Zu |
. Die letztere Änderung machte absolut keinen Unterschied, wie wir aus dieser Ausgabe erkennen können
$ echo 'ABC' | sed 's |.| xyz | g 'xyzxyzxyz
Und wir können unsere Ergebnisse so weit überprüft, indem wir diesen Befehl verwenden:
$ echo 'ABC' | sed 's/\./xyz/g 'ABC
Wie erwartet die |
Zu /
Änderung machte keinen Unterschied.
Also zurück zu unserem Dilemma - sollen wir sagen, dass die geringfügige Änderung des Hinzufügens \
ist schuld? Aber ist es wirklich ein Fehler?
NEIN. Was wir durch diese einfache Veränderung getan haben, ist, das zu machen .
Dot in ein wörtliches (buchstäblich) (\.
) Punkt. Mit anderen Worten, dies ist kein echter regelmäßiger Ausdruck mehr bei der Arbeit, sondern ein einfacher Ersatz für textliche Zeichenfolge, der als gelesen werden kann Ersetzen Sie einen wörtlichen Punkt in xyz
, und tun Sie dies wiederholt.
Lassen Sie uns dies beweisen;
$ echo 'ab… c' | sed 's/\./xyz/g 'abxyzxyzc
Dies ist erwartungsgemäß: Die beiden wörtlichen Punkte wurden individuell verändert (aufgrund der sich wiederholenden Natur des G
Qualifikation), zu xyz
, insgesamt nachgeben Abxyzxyzc
.
Super! Lassen Sie uns jetzt ein bisschen mehr erweitern.
Beispiel 3: Bring es an
Nichts wie das Tauchen im Kopf zuerst, richtig? Womöglich. Bis du das siehst;
$ echo 'a… b… c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd
Ja, zumindest auf den ersten Blick zu komplex. Beginnen wir mit einer Vereinfachung davon:
$ echo 'a… b… c' | sed 's | [\.b] \+| d | g; '' ADC
Sieht immer noch etwas schwierig aus, aber Sie werden es bald verstehen. Also, die Eingabezeichenfolge von nehmen A… B… c
, Wir können - basierend auf unserem vorherigen Beispiel - sehen, dass wir nach einem wörtlichen Punkt suchen (\.
). In diesem Fall folgt es jedoch B
und umgeben von [
Und ]
. Dieser Teil des regulären Ausdrucks ([\.B]
) kann als gelesen werden als Jeder wörtliche Punkt oder der Charakter B
(bisher nicht repetitiv; ich.e. Eine einzelne Charta, einer von ihnen, passt zu diesem Selektor).
Als nächstes qualifizieren wir uns ein bisschen weiter durch Anhängen \+
dazu Auswahlbox. Der \+
Zeigt an, dass wir nach mindestens einem und möglicherweise mehr dieser aufgelisteten Charaktere suchen (wörtlicher Punkt und B). Beachten Sie, dass die gesuchten Zeichen in beliebiger Reihenfolge direkt nebeneinander liegen müssen.
Zum Beispiel der Text … B… BBBB…
würde immer noch als ein einziges Ereignis übereinstimmen, während … B… BBB… B.B… BB
(Beachten Sie den Speicherplatz) wäre als getrennt (getrennt (sich wiederholt) Vorkommen und beides (i.e. nicht nur der erste) würde abgestimmt. Und in diesem Fall würden beide aufgrund der wirksam sind G
globaler/wiederholter Qualifikation.
Mit anderen Worten, in der natürlichen Sprache konnten wir diesen regulären Ausdruck als lesen Ersetzen Sie eine zusammenhängende Folge der Zeichen .
Und B
mit D
und tun Sie dies wiederholt.
Kannst du sehen, was passiert?? In der Eingangszeichenfolge haben wir … B…
, was durch den regulären Ausdruck übereinstimmt, wie er nur enthält \.
Und B
Figuren. Es wird dann ersetzt D
ergebend ADC
.
Unser größeres Beispiel sieht jetzt plötzlich einfacher aus. Lassen Sie uns zurückgehen:
$ echo 'a… b… c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd
Denken Sie darüber nach, wie sich der erste Teil des SED -Befehls verwandelte A… B… c
hinein ADC
, Wir können jetzt darüber nachdenken ADC
als Eingabe zum zweiten Befehl in der SED; s | [a-c] | d | g
. Beachten Sie, wie beide SED -Befehle durch getrennt werden ;
.
Alles, was passiert, ist, dass die Ausgabe des ersteren als Eingabe für den nachfolgenden Befehl angenommen wird. Dies funktioniert fast immer, obwohl es Zeiten gibt (bei der Verwendung komplexer Text-/Dokumentenänderung), in denen es besser ist, die Ausgabe von einem tatsächlichen SED -Befehl mit einem Bash -Rohr in einen anderen SED -Befehl zu übergeben (|
).
Analyse des zweiten Befehls (s | [a-c] | d | g
) Wir sehen, wie wir einen anderen haben Auswahlbox die Buchstaben von A nach C (ausgewählt werden[a-c])
); Die -
Zeigt einen Buchstabenbereich an, der alle Teil der regulären Expressionssyntax ist.
Die anderen Teile dieses Befehls sprechen jetzt für sich selbst. Insgesamt kann dieser zweite Befehl somit als gelesen werden Ersetzen Sie einen wörtlichen Charakter durch Reichweite A-C (i.e. A, B oder C)
hinein D
und tun Sie dies wiederholt. Das Ergebnis ist, dass A, D und C (Ausgang von ADC
von unserem ersten Befehl) werden in gerendert in DDD
.
Dieser sehr komplexe Befehl sieht jetzt nicht mehr so beängstigend aus, tut es? Lass uns runden.
Beispiel 4: eine Abschiedsnachricht
Echo 'Hab einen schönen Tag' | sed 's | $ | alle |; s | y | y to |; alle | '
Kannst du es herausfinden?? Spitze; $
bedeutet Ende der Linie in regulären Ausdrücken. Der Rest dieses komplexen Regex verwendet Wissen aus diesem Artikel. Was ist die Ausgabe?? Sehen Sie, ob Sie es mit einem Stück Papier herausfinden können, ohne die Befehlszeile zu verwenden. Wenn Sie es getan haben - oder wenn Sie es nicht getan haben, lassen Sie es uns in den Kommentaren unten wissen.
Abschluss
In diesem Tutorial hatten wir eine Einführung in grundlegende reguläre Ausdrücke, die sich mit einigen (frechen) fortgeschritteneren Beispielen zusammengeschlossen hatten.
Wenn Sie regelmäßige Ausdrücke lernen und den Code anderer Personen überprüfen, sehen Sie regelmäßige Ausdrücke, die komplex aussehen. Nehmen Sie sich Zeit, um sie herauszufinden, und spielen Sie mit regelmäßigen Ausdrücken in der Befehlszeile herum. Sie werden bald ein Experte sein und während die Analyse komplexer Regexes normalerweise erforderlich ist (der Geist eignet. Sie werden auch feststellen, dass ein komplex aussehender Regex bei weiterer Analyse normalerweise ganz einfach aussieht, sobald Sie es verstanden haben - genau wie in den obigen Beispielen.
Sie können jetzt auch unseren Artikel über reguläre Ausdrücke in Python lesen, da viele der dort bereitgestellten Informationen auch für die Verprüfung regelmäßiger Ausdrücke gilt, obwohl einige der Formatierungsanforderungen geringfügig unterschiedlich sind. Es wird Ihr Verständnis von regelmäßigen Ausdrücken, die Verwendung von ihnen und die Anwendung in verschiedenen Situationen und Codierungssprachen stärken. Sobald Sie ein Regex -Experte wurden, verblasst die kleinen Unterscheidungslinien zwischen Tools und Programmiersprachen normalerweise, und Sie werden sich in der Regel an bestimmte Syntaxanforderungen für jede Sprache oder jedes Werkzeug erinnern, in dem Sie arbeiten,/mit.
Genießen!
Verwandte Linux -Tutorials:
- Advanced Bash Regex mit Beispielen
- Dinge zu installieren auf Ubuntu 20.04
- Python reguläre Ausdrücke mit Beispielen
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- Big Data Manipulation zum Spaß und Gewinn Teil 3
- Big Data Manipulation zum Spaß und Gewinn Teil 1
- Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…
- Dinge zu installieren auf Ubuntu 22.04
- Bash Advanced Variable Idiome für die Fallempfindlichkeit…