Stream Editor - Loop

Come altri linguaggi di programmazione, anche SED fornisce una funzione di loop e branching per controllare il flusso di esecuzione. In questo capitolo, esploreremo di più su come utilizzare loop e branch in SED.

Un loop in SED funziona in modo simile a un file gotodichiarazione. Il SED può saltare alla riga contrassegnata dall'etichetta e continuare a eseguire i restanti comandi. In SED, possiamo definire un filelabel come segue:

:label 
:start 
:end 
:up

Nell'esempio sopra, un nome dopo i due punti (:) implica il nome dell'etichetta.

Per passare a un'etichetta specifica, possiamo utilizzare il bcomando seguito dal nome dell'etichetta. Se il nome dell'etichetta viene omesso, il SED salta alla fine del file SED.

Scriviamo un semplice script SED per comprendere i loop e i rami. Nel nostro file books.txt sono presenti diverse voci di titoli di libri e dei relativi autori. L'esempio seguente combina il titolo di un libro e il nome dell'autore in una riga separata da una virgola. Quindi cerca il modello "Paulo". Se il pattern corrisponde, stampa un trattino (-) davanti alla riga, altrimenti salta alPrint etichetta che stampa la riga.

[jerry]$ sed -n ' 
h;n;H;x 
s/\n/, / 
/Paulo/!b Print 
s/^/- / 
:Print 
p' books.txt

Eseguendo il codice sopra, ottieni il seguente risultato:

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

A prima vista, lo script precedente potrebbe sembrare criptico. Demistifichiamo questo.

  • I primi due comandi sono autoesplicativi h;n;H;x e s/\n/, / combina il titolo del libro e il suo autore separati da una virgola (,).

  • Il terzo comando salta all'etichetta Print solo quando il pattern non corrisponde, altrimenti la sostituzione viene eseguita dal quarto comando.

  • :Print è solo il nome di un'etichetta e come già sai, p è il comando di stampa.

Per migliorare la leggibilità, ogni comando SED viene posizionato su una riga separata. Tuttavia, si può scegliere di inserire tutti i comandi in una riga come segue:

[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt

Eseguendo il codice sopra, ottieni il seguente risultato:

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