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.