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.