Stream Editor - Reguläre Ausdrücke
Es sind die regulären Ausdrücke, die SED leistungsfähig und effizient machen. Eine Reihe komplexer Aufgaben kann mit regulären Ausdrücken gelöst werden. Jeder Befehlszeilenexperte kennt die Leistungsfähigkeit regulärer Ausdrücke.
Wie viele andere GNU / Linux-Dienstprogramme unterstützt auch SED reguläre Ausdrücke, die häufig als bezeichnet werden regex. In diesem Kapitel werden reguläre Ausdrücke ausführlich beschrieben. Das Kapitel ist in drei Abschnitte unterteilt: Standardmäßige reguläre Ausdrücke, POSIX-Klassen regulärer Ausdrücke und Metazeichen.
Standardmäßige reguläre Ausdrücke
Zeilenanfang (^)
In der Terminologie für reguläre Ausdrücke entspricht das Caret-Symbol (^) dem Zeilenanfang. Im folgenden Beispiel werden alle Zeilen gedruckt, die mit dem Muster "The" beginnen.
[jerry]$ sed -n '/^The/ p' books.txt
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
Zeilenende ($)
Das Zeilenende wird durch das Dollarsymbol ($) dargestellt. Im folgenden Beispiel werden die Zeilen gedruckt, die mit "Coelho" enden.
[jerry]$ sed -n '/Coelho$/ p' books.txt
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
The Alchemist, Paulo Coelho
The Pilgrimage, Paulo Coelho
Einzelzeichen (.)
Der Punkt (.) Entspricht einem einzelnen Zeichen mit Ausnahme des Zeilenendezeichens. Im folgenden Beispiel werden alle drei Buchstabenwörter gedruckt, die mit dem Zeichen "t" enden.
[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
cat
bat
rat
mat
Übereinstimmungszeichensatz ([])
In der Terminologie für reguläre Ausdrücke wird ein Zeichensatz in eckigen Klammern ([]) dargestellt. Es wird verwendet, um nur eines von mehreren Zeichen abzugleichen. Das folgende Beispiel entspricht den Mustern "Call" und "Tall", jedoch nicht "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
Call
Tall
Exklusives Set ([^])
Im exklusiven Satz negiert das Caret den Zeichensatz in den eckigen Klammern. Im folgenden Beispiel wird nur "Ball" gedruckt.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
Ball
Zeichenbereich ([-])
Wenn ein Zeichenbereich angegeben wird, stimmt der reguläre Ausdruck mit jedem Zeichen innerhalb des in eckigen Klammern angegebenen Bereichs überein. Das folgende Beispiel entspricht "Call" und "Tall", jedoch nicht "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
Call
Tall
Lassen Sie uns nun den Bereich auf "AP" ändern und das Ergebnis beobachten.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
Call
Ball
Null bei einem Vorkommen (\?)
In SED entspricht das Fragezeichen (\?) Null oder einem Vorkommen des vorhergehenden Zeichens. Das folgende Beispiel entspricht sowohl "Verhalten" als auch "Verhalten". Hier haben wir "u" als optionales Zeichen mit "\?"
[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
Behaviour
Behavior
Ein oder mehrere Vorkommen (\ +)
In SED entspricht das Pluszeichen (\ +) einem oder mehreren Vorkommen des vorhergehenden Zeichens. Das folgende Beispiel entspricht einem oder mehreren Vorkommen von "2".
[jerry]$ echo -e "111\n22\n123\n234\n456\n222" | sed -n '/2\+/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
22
123
234
222
Null oder mehr Vorkommen (*)
Sternchen (*) stimmen mit dem null oder mehr Vorkommen des vorhergehenden Zeichens überein. Das folgende Beispiel entspricht "ca", "cat", "catt" usw.
[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
ca
cat
Genau N Vorkommen {n}
{n} stimmt genau mit "n" Vorkommen des vorhergehenden Zeichens überein. Im folgenden Beispiel werden nur dreistellige Zahlen gedruckt. Zuvor müssen Sie jedoch die folgende Datei erstellen, die nur Zahlen enthält.
[jerry]$ cat numbers.txt
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
Schreiben wir den SED-Ausdruck.
[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
100
Beachten Sie, dass das Paar geschweifter Klammern durch das Zeichen "\" maskiert wird.
Mindestens n Vorkommen {n,}
{n,} entspricht mindestens "n" Vorkommen des vorhergehenden Zeichens. Im folgenden Beispiel werden alle Zahlen größer oder gleich fünf Ziffern gedruckt.
[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
10000
100000
1000000
10000000
100000000
1000000000
M bis N Vorkommen {m, n}
{m, n} entspricht mindestens "m" und höchstens "n" Vorkommen des vorhergehenden Zeichens. Im folgenden Beispiel werden alle Zahlen mit mindestens fünf, aber nicht mehr als acht Ziffern gedruckt.
[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
10000
100000
1000000
10000000
Rohr (|)
In SED verhält sich das Pipe-Zeichen wie eine logische ODER-Verknüpfung. Es werden Elemente von beiden Seiten des Rohrs abgeglichen. Das folgende Beispiel entspricht entweder "str1" oder "str3".
[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
str1
str3
Beachten Sie, dass das Paar aus Klammer und Pipe (|) durch das Zeichen "\" maskiert wird.
Fluchtzeichen
Es gibt bestimmte Sonderzeichen. Beispielsweise wird Zeilenumbruch durch "\ n", Wagenrücklauf durch "\ r" usw. dargestellt. Um diese Zeichen im regulären ASCII-Kontext zu verwenden, müssen wir sie mit dem Schrägstrich (\) maskieren. Dieses Kapitel zeigt das Entkommen von Sonderzeichen.
Escape "\"
Das folgende Beispiel entspricht dem Muster "\".
[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
str1\str2
Escape "\ n"
Das folgende Beispiel entspricht dem neuen Zeilenzeichen.
[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
str1\nstr2
Escape "\ r"
Das folgende Beispiel entspricht dem Wagenrücklauf.
[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
str1\rstr2
Escape "\ dnnn"
Dies entspricht einem Zeichen, dessen dezimaler ASCII-Wert "nnn" ist. Das folgende Beispiel entspricht nur dem Zeichen "a".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
a
Escape "\ onnn"
Dies entspricht einem Zeichen, dessen oktaler ASCII-Wert "nnn" ist. Das folgende Beispiel entspricht nur dem Zeichen "b".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
b
Dies entspricht einem Zeichen, dessen hexadezimaler ASCII-Wert "nnn" ist. Das folgende Beispiel entspricht nur dem Zeichen "c".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
c
POSIX-Klassen regulärer Ausdrücke
Es gibt bestimmte reservierte Wörter, die eine besondere Bedeutung haben. Diese reservierten Wörter werden als POSIX-Klassen für reguläre Ausdrücke bezeichnet. In diesem Abschnitt werden die von SED unterstützten POSIX-Klassen beschrieben.
[: Alnum:]
Es impliziert alphabetische und numerische Zeichen. Das folgende Beispiel stimmt nur mit "Eins" und "123" überein, stimmt jedoch nicht mit dem Tabulatorzeichen überein.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
One
123
[:Alpha:]
Es werden nur alphabetische Zeichen verwendet. Das folgende Beispiel entspricht nur dem Wort "Eins".
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
One
[:leer:]
Dies impliziert ein leeres Zeichen, das entweder ein Leerzeichen oder ein Tabulator sein kann. Das folgende Beispiel entspricht nur dem Tabulatorzeichen.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
^I$
Beachten Sie, dass der Befehl "cat -vte" verwendet wird, um Tabulatorzeichen (^ I) anzuzeigen.
[:Ziffer:]
Es werden nur Dezimalzahlen impliziert. Das folgende Beispiel entspricht nur der Ziffer "123".
[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
123
[:niedriger:]
Es werden nur Kleinbuchstaben verwendet. Das folgende Beispiel entspricht nur "eins".
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
one
[:Oberer, höher:]
Es werden nur Großbuchstaben verwendet. Das folgende Beispiel entspricht nur "ZWEI".
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
TWO
[: punct:]
Dies impliziert Satzzeichen, die nicht Leerzeichen oder alphanumerische Zeichen enthalten
[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
One,Two
[:Raum:]
Es impliziert Leerzeichen. Das folgende Beispiel veranschaulicht dies.
[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
123^L^I$
Metazeichen
Wie herkömmliche reguläre Ausdrücke unterstützt SED auch Metazeichen. Dies sind reguläre Ausdrücke im Perl-Stil. Beachten Sie, dass die Unterstützung von Metazeichen GNU SED-spezifisch ist und möglicherweise nicht mit anderen SED-Varianten funktioniert. Lassen Sie uns die Metazeichen im Detail besprechen.
Wortgrenze (\ b)
In der Terminologie für reguläre Ausdrücke entspricht "\ b" der Wortgrenze. Zum Beispiel entspricht "\ bthe \ b" "den", aber nicht "diesen", "dort", "sie", "dann" und so weiter. Das folgende Beispiel veranschaulicht dies.
[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
the
Nicht-Wortgrenze (\ B)
In der Terminologie für reguläre Ausdrücke entspricht "\ B" der Nicht-Wortgrenze. Zum Beispiel stimmt "das \ B" mit "diesen" und "sie" überein, aber nicht mit "dem". Das folgende Beispiel veranschaulicht dies.
[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
these
they
Einzelne Leerzeichen (\ s)
In SED impliziert "\ s" ein einzelnes Leerzeichen. Das folgende Beispiel stimmt mit "Line \ t1" überein, stimmt jedoch nicht mit "Line1" überein.
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
Line 1
Einzelner Nicht-Leerzeichen (\ S)
In SED impliziert "\ S" ein einzelnes Leerzeichen. Das folgende Beispiel stimmt mit "Line2" überein, stimmt jedoch nicht mit "Line \ t1" überein.
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
Line2
Einzelwortzeichen (\ w)
In SED impliziert "\ w" Einzelwortzeichen, dh alphabetische Zeichen, Ziffern und Unterstriche (_). Das folgende Beispiel veranschaulicht dies.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
One
123
1_2
Einzelne Nicht-Wort-Zeichen (\ W)
In SED impliziert "\ W" ein einzelnes Nichtwortzeichen, das genau "\ w" entgegengesetzt ist. Das folgende Beispiel veranschaulicht dies.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
&;#
Beginn des Musterraums (\ `)
In SED impliziert "\` "den Beginn des Musterraums. Das folgende Beispiel entspricht nur dem Wort "Eins".
[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'
Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:
One