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