Stream Editor - Sonderzeichen

SED bietet zwei Sonderzeichen, die als Befehle behandelt werden. Dieses Kapitel zeigt die Verwendung dieser beiden Sonderzeichen.

= Befehl

Der Befehl "=" behandelt Zeilennummern. Im Folgenden ist die Syntax des Befehls "=" angegeben:

[/pattern/]= 
[address1[,address2]]=

Der Befehl = schreibt die Zeilennummer gefolgt von ihrem Inhalt in den Standardausgabestream. Das folgende Beispiel veranschaulicht dies.

[jerry]$ sed '=' books.txt

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

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

Drucken wir die Zeilennummern und den Inhalt der ersten vier Zeilen. Der folgende Befehl druckt die ersten vier Zeilen mit Zeilennummern und die verbleibenden ohne Zeilennummern.

[jerry]$ sed '1, 4=' books.txt

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

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
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

Zusätzlich können wir die SED anweisen, Zeilennummern zu drucken, wenn eine Musterübereinstimmung erfolgreich ist. Im folgenden Beispiel wird die Zeilennummer gedruckt, die das Muster "Paulo" enthält.

[jerry]$ sed '/Paulo/ =' 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 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Können Sie sich vorstellen, was der folgende SED-Befehl bewirkt?

[jerry]$ sed -n '$ =' books.txt

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

6

Ja, du hast recht. Es zählt die Gesamtzahl der in der Datei vorhandenen Zeilen. Lassen Sie uns den Code entmystifizieren. Im Befehlsabschnitt haben wir "$ =" verwendet, das die Zeilennummer der letzten Zeile gefolgt von ihrem Inhalt druckt. Wir haben aber auch die zur Verfügung gestellt-n Flag, das das Standarddrucken des Musterpuffers unterdrückt. Daher wird nur die letzte Zeilennummer angezeigt.

& Befehl

SED unterstützt das Sonderzeichen &. Immer wenn eine Musterübereinstimmung erfolgreich ist, speichert dieses Sonderzeichen das übereinstimmende Muster. Es wird häufig mit dem Substitutionsbefehl verwendet. Lassen Sie uns sehen, wie wir diese effiziente Funktion nutzen können.

Jede Zeile in der Datei book.txt ist nummeriert. Fügen wir die Wörter hinzuBook numberam Anfang jeder Zeile. Das folgende Beispiel veranschaulicht dies.

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

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

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

Dieses Beispiel ist sehr einfach. Zuerst suchen wir nach dem ersten Vorkommen einer Ziffer, dh der Zeilennummer (deshalb haben wir [[: digit:]] verwendet), und die SED speichert das übereinstimmende Muster automatisch im Sonderzeichen &. Im zweiten Schritt fügen wir die Wörter einBook number vor jedem übereinstimmenden Muster, dh vor jeder Zeile.

Nehmen wir ein anderes Beispiel. In der Datei book.txt gibt die letzte Ziffer die Anzahl der Seiten des Buches an. Fügen wir vorher "Pages =" hinzu. Suchen Sie dazu das letzte Vorkommen der Ziffer und ersetzen Sie es durch "Pages = &". Hier speichert & das übereinstimmende Muster, dh die Anzahl der Seiten

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt

Wenn Sie die obige Syntax ausführen, erhalten Sie das folgende Ergebnis:

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

Denken Sie vorerst daran [[:digit:]]*$findet das letzte Vorkommen der Ziffer. Im Kapitel "Reguläre Ausdrücke" werden wir mehr über reguläre Ausdrücke erfahren.