Stream Editor - Caratteri speciali

SED fornisce due caratteri speciali che vengono trattati come comandi. Questo capitolo illustra l'uso di questi due caratteri speciali.

= Comando

Il comando "=" si occupa dei numeri di riga. Di seguito è riportata la sintassi del comando "=":

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

Il comando = scrive il numero di riga seguito dal suo contenuto nel flusso di output standard. Il seguente esempio lo illustra.

[jerry]$ sed '=' books.txt

Eseguendo il codice sopra, ottieni il seguente risultato:

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

Stampiamo i numeri di riga e il contenuto delle prime quattro righe. Il comando seguente stampa le prime quattro righe con i numeri di riga e le restanti senza i numeri di riga.

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

Eseguendo il codice sopra, ottieni il seguente risultato:

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

Inoltre, possiamo istruire il SED a stampare i numeri di riga quando una corrispondenza di pattern ha successo. L'esempio seguente stampa il numero di riga che contiene il modello "Paulo".

[jerry]$ sed '/Paulo/ =' books.txt

Eseguendo il codice sopra, ottieni il seguente risultato:

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

Riuscite a indovinare cosa fa il seguente comando SED?

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

Eseguendo il codice sopra, ottieni il seguente risultato:

6

Si hai ragione. Conta il numero totale di righe presenti nel file. Demistifichiamo il codice. Nella sezione comandi, abbiamo usato "$ =" che stampa il numero di riga dell'ultima riga seguito dal suo contenuto. Ma abbiamo anche fornito il file-n flag che sopprime la stampa di default del pattern buffer. Pertanto, viene visualizzato solo il numero dell'ultima riga.

& Comando

SED supporta il carattere speciale &. Ogni volta che una corrispondenza del modello ha successo, questo carattere speciale memorizza il modello corrispondente. Viene spesso utilizzato con il comando di sostituzione. Vediamo come possiamo sfruttare questa funzionalità efficiente.

Ogni riga nel file book.txt è numerata. Aggiungiamo le paroleBook numberall'inizio di ogni riga. Il seguente esempio lo illustra.

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

Eseguendo il codice sopra, ottieni il seguente risultato:

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

Questo esempio è molto semplice. Per prima cosa, cerchiamo la prima occorrenza di una cifra, che è il numero di riga (ecco perché abbiamo usato [[: digit:]]) e il SED memorizza automaticamente il modello corrispondente nel carattere speciale &. Nella seconda fase, inseriamo le paroleBook number prima di ogni modello abbinato, cioè prima di ogni riga.

Facciamo un altro esempio. Nel file book.txt, l'ultima cifra indica il numero di pagine del libro. Aggiungiamo prima "Pages =". A tale scopo, trova l'ultima occorrenza della cifra e sostituiscila con "Pages = &". Qui & memorizza il modello corrispondente, cioè il numero di pagine

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

Eseguendo la sintassi sopra, si ottiene il seguente risultato:

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

Per il momento, ricordalo [[:digit:]]*$trova l'ultima occorrenza della cifra. Nel capitolo "Espressioni regolari, esploreremo di più sulle espressioni regolari.