Stream Editor - Strings

Ersatzbefehl

Textsubstitutionsoperationen wie "Suchen und Ersetzen" sind in jedem Texteditor üblich. In diesem Abschnitt veranschaulichen wir, wie SED die Textersetzung durchführt. Unten ist die Syntax des Substitutionsbefehls angegeben.

[address1[,address2]]s/pattern/replacement/[flags]

Hier, address1 und address2sind die Start- und Endadressen, die entweder Zeilennummern oder Musterzeichenfolgen sein können. Beide Adressen sind optionale Parameter. Das Muster ist der Text, den wir durch die Ersatzzeichenfolge ersetzen möchten. Zusätzlich können wir optionale Flags mit der SED angeben.

In der Datei books.txt haben wir jede Spalte durch Komma (,) getrennt. Verwenden wir den vertikalen Balken (|), um jede Spalte zu trennen. Ersetzen Sie dazu das Komma (,) durch den vertikalen Balken (|).

[jerry]$ sed 's/,/ | /' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

1) A Storm of Swords | George R. R. Martin, 1216 
2) The Two Towers | J. R. R. Tolkien, 352 
3) The Alchemist | Paulo Coelho, 197 
4) The Fellowship of the Ring | J. R. R. Tolkien, 432 
5) The Pilgrimage | Paulo Coelho, 288 
6) A Game of Thrones | George R. R. Martin, 864

Wenn Sie genau hinschauen, wird nur das erste Komma ersetzt und das zweite bleibt unverändert. Warum? Sobald das Muster übereinstimmt, ersetzt SED es durch die Ersatzzeichenfolge und wechselt zur nächsten Zeile. Standardmäßig wird nur das erste Vorkommen ersetzt. Verwenden Sie das globale Flag (g) mit SED wie folgt, um alle Vorkommen zu ersetzen:

[jerry]$ sed 's/,/ | /g' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

1) A Storm of Swords | George R. R. Martin | 1216 
2) The Two Towers | J. R. R. Tolkien | 352 
3) The Alchemist | Paulo Coelho | 197 
4) The Fellowship of the Ring | J. R. R. Tolkien | 432 
5) The Pilgrimage | Paulo Coelho | 288 
6) A Game of Thrones | George R. R. Martin | 864

Jetzt werden alle Kommas (,) durch vertikale Balken (|) ersetzt.

Wir können die SED anweisen, nur dann eine Textersetzung durchzuführen, wenn eine Musterübereinstimmung erfolgreich ist. Das folgende Beispiel ersetzt Komma (,) nur dann durch einen vertikalen Balken (|), wenn eine Linie das Muster Die Pilgerfahrt enthält.

[jerry]$ sed '/The Pilgrimage/ s/,/ | /g' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage | Paulo Coelho | 288 
6) A Game of Thrones, George R. R. Martin, 864

Darüber hinaus kann SED ein bestimmtes Auftreten des Musters ersetzen. Ersetzen wir nur die zweite Instanz von Komma (,) durch den vertikalen Balken (|).

[jerry]$ sed 's/,/ | /2' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

1) A Storm of Swords, George R. R. Martin | 1216 
2) The Two Towers, J. R. R. Tolkien | 352 
3) The Alchemist, Paulo Coelho | 197 
4) The Fellowship of the Ring, J. R. R. Tolkien | 432 
5) The Pilgrimage,Paulo Coelho | 288 
6) A Game of Thrones, George R. R. Martin  | 864

Im obigen Beispiel impliziert die Nummer am Ende des SED-Befehls (oder an der Stelle des Flags) das 2. Vorkommen.

SED bietet eine interessante Funktion. Nach dem Ersetzen bietet SED die Option, nur die geänderten Zeilen anzuzeigen. Zu diesem Zweck verwendet SED diepFlagge, die sich auf Druck bezieht. Im folgenden Beispiel werden nur geänderte Zeilen aufgelistet.

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

Wir können geänderte Zeilen auch in einer anderen Datei speichern. Um dieses Ergebnis zu erzielen, verwenden Sie diewFlagge. Das folgende Beispiel zeigt, wie es geht.

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt

Wir haben den gleichen SED-Befehl verwendet. Lassen Sie uns den Inhalt der überprüfenjunk.txt Datei.

[jerry]$ cat junk.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

Verwenden Sie das i-Flag, um Groß- und Kleinschreibung nicht zu berücksichtigen. Im folgenden Beispiel wird die Ersetzung ohne Berücksichtigung der Groß- und Kleinschreibung durchgeführt.

[jerry]$ sed  -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

Bisher haben wir nur das Zeichen für den Schrägstrich (/) als Trennzeichen verwendet, aber wir können auch den vertikalen Balken (|) am Zeichen (@), das Caret (^) und das Ausrufezeichen (!) Als Trennzeichen verwenden. Das folgende Beispiel zeigt, wie andere Zeichen als Trennzeichen verwendet werden.

Nehmen wir an, Sie müssen den Pfad ersetzen /bin/sed mit /home/jerry/src/sed/sed-4.2.2/sed. Daher sieht Ihr SED-Befehl folgendermaßen aus:

[jerry]$ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/jerry\/src\/sed\/sed-4.2.2\/sed/'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

/home/jerry/src/sed/sed-4.2.2/sed

Wir können diesen Befehl lesbarer und verständlicher machen. Verwenden wir den vertikalen Balken (|) als Trennzeichen und sehen Sie das Ergebnis.

[jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

/home/jerry/src/sed/sed-4.2.2/sed

Tatsächlich! Wir haben das gleiche Ergebnis erzielt und die Syntax ist besser lesbar. In ähnlicher Weise können wir das "at" -Zeichen (@) wie folgt als Trennzeichen verwenden:

[jerry]$ echo "/bin/sed" | sed 's@/bin/sed@/home/jerry/src/sed/sed-4.2.2/sed@'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

/home/jerry/src/sed/sed-4.2.2/sed

Zusätzlich können wir Caret (^) als Trennzeichen verwenden.

[jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

/home/jerry/src/sed/sed-4.2.2/sed

Wir können das Ausrufezeichen (!) Als Trennzeichen auch wie folgt verwenden:

[jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

/home/jerry/src/sed/sed-4.2.2/sed

Im Allgemeinen wird Backslash (/) als Trennzeichen verwendet, aber manchmal ist es bequemer, andere unterstützte Trennzeichen mit SED zu verwenden.

Erstellen eines Teilstrings

Wir haben den mächtigen Ersatzbefehl gelernt. Lassen Sie uns sehen, ob wir einen Teilstring aus einem übereinstimmenden Text finden können. Lassen Sie uns anhand eines Beispiels verstehen, wie es geht.

Betrachten wir den folgenden Text:

[jerry]$ echo "Three One Two"

Angenommen, wir müssen es in einer Sequenz anordnen. Das heißt, es sollte zuerst Eins, dann Zwei und schließlich Drei drucken. Der folgende Einzeiler macht das Notwendige.

echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'

Beachten Sie, dass im obigen Beispiel der vertikale Balken (|) als Trennzeichen verwendet wird.

In SED können Teilzeichenfolgen mithilfe eines Gruppierungsoperators angegeben werden, und es muss ein Escapezeichen vorangestellt werden, d. H. \( und \).

\wist ein regulärer Ausdruck, der mit einem Buchstaben, einer Ziffer oder einem Unterstrich übereinstimmt. Mit "+" werden mehr als ein Zeichen abgeglichen. Mit anderen Worten, der reguläre Ausdruck\(\w\+\) stimmt mit dem einzelnen Wort aus der Eingabezeichenfolge überein.

In der Eingabezeichenfolge gibt es drei durch Leerzeichen getrennte Wörter, daher gibt es threereguläre Ausdrücke durch Leerzeichen getrennt. Der erste reguläre Ausdruck speichert das erste Wort, dh Drei, der zweite speichert das WortOneund der dritte speichert das Wort Two

Auf diese Teilzeichenfolgen wird verwiesen \N,Dabei ist N die Teilzeichenfolge. Daher,\2 druckt den zweiten Teilstring, dh One; \3 druckt den dritten Teilstring, dh Two; und \1 druckt den ersten Teilstring, dh Three

Trennen wir diese Wörter durch Kommas (,) und ändern den regulären Ausdruck entsprechend.

[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

One,Two,Three

Beachten Sie, dass der reguläre Ausdruck jetzt ein Komma (,) anstelle eines Leerzeichens enthält.

String Replacement Flags (nur GNU SED)

Im vorherigen Abschnitt haben wir einige Beispiele für den Substitutionsbefehl gesehen. Die GNU SED bietet einige spezielle Escape-Sequenzen, die in der Ersatzzeichenfolge verwendet werden können. Beachten Sie, dass diese Zeichenfolgen zum Ersetzen von Zeichenfolgen GNU-spezifisch sind und möglicherweise nicht mit anderen Varianten von SED funktionieren. Hier werden wir String-Ersetzungsflags diskutieren.

  • \ L: Wenn \ L in der Ersatzzeichenfolge angegeben ist, werden alle verbleibenden Zeichen des Wortes nach \ L als Kleinbuchstaben behandelt. Beispielsweise werden die Zeichen "ULO" als Kleinbuchstaben behandelt.

[jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

3) The Alchemist, PAulo Coelho, 197
5) The Pilgrimage, PAulo Coelho, 288
  • \ u: Wenn \ u in der Ersetzungszeichenfolge angegeben ist, wird das unmittelbare Zeichen nach \ u als Großbuchstabe behandelt. Im folgenden Beispiel wird \ u vor den Zeichen 'a' und 'o' verwendet. Daher behandelt SED diese Zeichen als Großbuchstaben.

[jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

3) The Alchemist, pAulO Coelho, 197 
5) The Pilgrimage, pAulO Coelho, 288
  • \ U: Wenn \ U in der Ersatzzeichenfolge angegeben ist, werden alle verbleibenden Zeichen des Wortes nach \ U als Großbuchstaben behandelt.

[jerry]$ sed -n 's/Paulo/\Upaulo/p' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

3) The Alchemist, PAULO Coelho, 197 
5) The Pilgrimage, PAULO Coelho, 288
  • \ E: Dieses Flag sollte mit \ L oder \ U verwendet werden. Es stoppt die durch das Flag \ L oder \ U initiierte Konvertierung. Im folgenden Beispiel wird nur das erste Wort durch Großbuchstaben ersetzt.

[jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

3) The Alchemist, PAULO coelho, 197 
5) The Pilgrimage, PAULO coelho, 288