Stream Editor - Verwalten von Mustern

Wir haben bereits die Verwendung von Muster- und Haltepuffer diskutiert. In diesem Kapitel werden wir mehr über ihre Verwendung erfahren. Lassen Sie uns das besprechennBefehl, der den Musterraum druckt. Es wird in Verbindung mit anderen Befehlen verwendet. Unten ist die Syntax des Befehls then angegeben.

[address1[,address2]]n

Nehmen wir ein Beispiel.

[jerry]$ sed 'n' books.txt

Wenn der obige Code ausgeführt wird, wird das folgende Ergebnis erzeugt:

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

Das n Der Befehl druckt den Inhalt des Musterpuffers, löscht den Musterpuffer, ruft die nächste Zeile in den Musterpuffer ab und wendet Befehle darauf an.

Nehmen wir an, es gibt drei SED-Befehle n und zwei SED-Befehle danach n wie folgt:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

In diesem Fall wendet SED die ersten drei Befehle auf den Musterpuffer an, löscht den Musterpuffer, ruft die nächste Zeile in den Musterpuffer ab und wendet danach den vierten und fünften Befehl darauf an. Dies ist ein sehr wichtiges Konzept. Gehen Sie nicht weiter, ohne ein klares Verständnis dafür zu haben.

Der Haltepuffer enthält Daten, aber SED-Befehle können nicht direkt auf den Haltepuffer angewendet werden. Daher müssen wir die Haltepufferdaten in den Musterpuffer bringen. SED bietet diexBefehl zum Austauschen des Inhalts von Mustern und zum Halten von Puffern. Die folgenden Befehle veranschaulichen diex Befehl.

Lassen Sie uns die Datei books.txt leicht ändern. Angenommen, die Datei enthält Buchtitel, gefolgt von den Namen der Autoren. Nach der Änderung sollte die Datei folgendermaßen aussehen:

[jerry]$ cat books.txt

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

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

Lassen Sie uns den Inhalt der beiden Puffer austauschen. Im folgenden Beispiel werden beispielsweise nur die Namen der Autoren gedruckt.

[jerry]$ sed -n 'x;n;p' books.txt

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

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin

Lassen Sie uns verstehen, wie dieser Befehl funktioniert.

  • Zunächst liest SED die erste Zeile, dh A Storm of Swords, in den Musterpuffer.

  • x Befehl verschiebt diese Zeile in den Haltepuffer.

  • n holt die nächste Zeile, dh George RR Martin, in den Musterpuffer.

  • Die Steuerung übergibt den Befehl, gefolgt von n, der den Inhalt des Musterpuffers druckt.

  • Der Vorgang wird wiederholt, bis die Datei erschöpft ist.

Lassen Sie uns nun den Inhalt der Puffer vor dem Drucken austauschen. Ratet mal, was passiert? Ja, es werden die Titel von Büchern gedruckt.

[jerry]$ sed -n 'x;n;x;p' books.txt

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

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

Das hBefehl befasst sich mit dem Haltepuffer. Es kopiert Daten aus dem Musterpuffer in den Haltepuffer. Vorhandene Daten aus dem Haltepuffer werden überschrieben. Notiere dass derhBefehl verschiebt keine Daten, er kopiert nur Daten. Daher bleiben die kopierten Daten unverändert im Musterpuffer. Unten ist die Syntax von angegebenh Befehl.

[address1[,address2]]h

Der folgende Befehl gibt nur die Titel des Autors Paulo Coelho aus.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt

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

The Alchemist 
The Pilgrimage

Lassen Sie uns verstehen, wie der obige Befehl funktioniert. Der Inhalt von books.txt folgt einem bestimmten Format. Die erste Zeile ist der Buchtitel, gefolgt vom Autor des Buches. Im obigen Befehl "!" wird verwendet, um die Bedingung umzukehren, dh die Zeile wird nur dann in den Haltepuffer kopiert, wenn eine Musterübereinstimmung nicht erfolgreich ist. Und geschweifte Klammern {} werden verwendet, um mehrere SED-Befehle zu gruppieren

Im ersten Durchgang des Befehls liest SED die erste Zeile, dh A Storm of Swords, in den Musterpuffer und prüft, ob sie das Muster Paulo enthält oder nicht. Da die Musterübereinstimmung nicht erfolgreich ist, wird diese Zeile in den Haltepuffer kopiert. Jetzt enthalten sowohl der Musterpuffer als auch der Haltepuffer dieselbe Zeile, dh A Storm of Swords. Im zweiten Schritt wird geprüft, ob die Zeile das Muster Paulo enthält oder nicht. Da das Muster nicht übereinstimmt, macht es nichts.

Im zweiten Durchgang liest es die nächste Zeile George RR Martin in den Musterpuffer und wendet die gleichen Schritte an. Für die nächsten drei Zeilen wird dasselbe getan. Am Ende des fünften Durchgangs enthalten beide Puffer The Alchemist. Zu Beginn des sechsten Durchgangs liest es die Zeile Paulo Coelho und kopiert diese Zeile nicht in den Haltepuffer, wenn das Muster übereinstimmt. Daher enthält der Musterpuffer Paulo Coelho und der Haltepuffer The Alchemist.

Danach wird geprüft, ob der Musterpuffer das Muster Paulo enthält. Wenn die Musterübereinstimmung erfolgreich ist, tauscht sie den Inhalt des Musterpuffers mit dem Haltepuffer aus. Jetzt enthält der Musterpuffer The Alchemist und der Haltepuffer Paulo Coelho. Schließlich wird der Inhalt des Musterpuffers gedruckt. Die gleichen Schritte werden auf das Muster Die Pilgerfahrt angewendet.

Das hBefehl zerstört den vorherigen Inhalt des Haltepuffers. Dies ist nicht immer akzeptabel, da wir manchmal den Inhalt bewahren müssen. Zu diesem Zweck stellt SED dieHBefehl, der den Inhalt an den Haltepuffer anfügt, indem am Ende eine neue Zeile hinzugefügt wird. Der einzige Unterschied zwischenh und HBefehl ist, der erstere überschreibt Daten aus dem Haltepuffer, während der letztere Daten an den Haltepuffer anfügt. Die Syntax ähnelt der vonh Befehl.

[address1[,address2]]H

Nehmen wir ein anderes Beispiel. Anstatt nur Buchtitel zu drucken, drucken Sie diesmal auch die Namen ihrer Autoren. Im folgenden Beispiel werden die Buchtitel gefolgt von den Namen der Autoren gedruckt.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt

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

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

Wir haben gelernt, wie der Inhalt des Musterpuffers kopiert / angehängt wird, um den Puffer zu halten. Können wir auch die Umkehrfunktion ausführen? Ja sicher! Zu diesem Zweck stellt SED diegBefehl, der Daten aus dem Haltepuffer in den Musterpuffer kopiert. Beim Kopieren werden vorhandene Daten aus dem Musterbereich überschrieben. Unten ist die Syntax von angegebeng Befehl.

[address1[,address2]]g

Betrachten wir dasselbe Beispiel: Drucken von Buchtiteln und ihren Autoren. Dieses Mal drucken wir zuerst den Namen des Autors und in der nächsten Zeile den entsprechenden Buchtitel. Der folgende Befehl gibt den Namen des Autors Paulo Coelho aus, gefolgt vom Buchtitel.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt

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

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

Der erste Befehl bleibt unverändert. Am Ende des fünften Durchgangs enthalten beide Puffer The Alchemist. Zu Beginn des sechsten Durchgangs liest es die Zeile Paulo Coelho und kopiert diese Zeile nicht in den Haltepuffer, wenn das Muster übereinstimmt. Daher enthält der Musterraum Paulo Coelho und der Laderaum The Alchemist.

Danach wird geprüft, ob der Musterraum das Muster Paulo enthält. Wenn die Musterübereinstimmung erfolgreich ist, druckt sie zuerst den Inhalt des Musterraums, dh Paulo Coelho, und kopiert dann den Haltepuffer in den Musterpuffer. Daher enthalten sowohl die Muster- als auch die Haltepuffer The Alchemist. Schließlich wird der Inhalt des Musterpuffers gedruckt. Die gleichen Schritte werden auf das Muster Die Pilgerfahrt angewendet.

Ebenso können wir den Inhalt des Haltepuffers an den Musterpuffer anhängen. SED bietet dieG Befehl, der den Inhalt an den Musterpuffer anfügt, indem am Ende eine neue Zeile hinzugefügt wird.

[address1[,address2]]G

Nehmen wir nun das vorherige Beispiel, in dem der Name des Autors Paulo Coelhof nach seinem Buchtitel gedruckt ist. Führen Sie den folgenden SED-Befehl aus, um das gleiche Ergebnis zu erzielen.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

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

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

Können Sie das obige Beispiel ändern, um die Buchtitel anzuzeigen, denen die Autoren folgen? Einfach, tauschen Sie einfach den Pufferinhalt vor demG Befehl.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

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

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho