Stream Editor - Schleifen

Wie andere Programmiersprachen bietet auch SED eine Schleifen- und Verzweigungsfunktion zur Steuerung des Ausführungsflusses. In diesem Kapitel werden wir mehr über die Verwendung von Schleifen und Zweigen in SED erfahren.

Eine Schleife in SED funktioniert ähnlich wie a gotoErklärung. SED kann zu der durch das Etikett gekennzeichneten Zeile springen und die verbleibenden Befehle ausführen. In SED können wir a definierenlabel wie folgt:

:label 
:start 
:end 
:up

Im obigen Beispiel impliziert ein Name nach Doppelpunkt (:) den Markennamen.

Um zu einem bestimmten Label zu springen, können wir das verwenden bBefehl gefolgt vom Markennamen. Wenn der Labelname weggelassen wird, springt die SED zum Ende der SED-Datei.

Schreiben wir ein einfaches SED-Skript, um die Schleifen und Zweige zu verstehen. In unserer Datei books.txt gibt es mehrere Einträge von Buchtiteln und deren Autoren. Das folgende Beispiel kombiniert einen Buchtitel und seinen Autorennamen in einer durch Komma getrennten Zeile. Dann sucht es nach dem Muster "Paulo". Wenn das Muster übereinstimmt, wird ein Bindestrich (-) vor der Zeile gedruckt, andernfalls springt es zumPrint Etikett, das die Linie druckt.

[jerry]$ sed -n ' 
h;n;H;x 
s/\n/, / 
/Paulo/!b Print 
s/^/- / 
:Print 
p' 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

Auf den ersten Blick sieht das obige Skript möglicherweise kryptisch aus. Lassen Sie uns dies entmystifizieren.

  • Die ersten beiden Befehle sind selbsterklärend h;n;H;x und s/\n/, / Kombinieren Sie den Buchtitel und seinen Autor durch ein Komma (,) getrennt.

  • Der dritte Befehl springt zum Etikett Print Nur wenn das Muster nicht übereinstimmt, wird der vierte Befehl ersetzt.

  • :Print ist nur ein Markenname und wie Sie bereits wissen, p ist der Druckbefehl.

Um die Lesbarkeit zu verbessern, wird jeder SED-Befehl in eine separate Zeile gestellt. Sie können jedoch alle Befehle wie folgt in einer Zeile platzieren:

[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' 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