Stream Editor - Pattern Buffer
Una delle operazioni di base che eseguiamo su qualsiasi file è visualizzarne il contenuto. A tale scopo, possiamo utilizzare il fileprintcomando che stampa il contenuto del pattern buffer. Quindi impariamo di più sul pattern buffer
Per prima cosa crea un file contenente il numero di riga, il nome del libro, il suo autore e il numero di pagine. In questo tutorial, useremo questo file. È possibile utilizzare qualsiasi file di testo in base alle proprie esigenze. Il nostro file di testo sarà simile a questo:
[jerry]$ vi books.txt
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
Ora stampiamo il contenuto del file.
[jerry]$ sed 'p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
1) A Storm of Swords, George R. R. Martin, 1216
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
6) A Game of Thrones, George R. R. Martin, 864
Potresti chiederti perché ogni riga viene visualizzata due volte. Cerchiamo di scoprirlo.
Ricordi il flusso di lavoro di SED? Per impostazione predefinita, SED stampa il contenuto del buffer dei pattern. Inoltre, abbiamo incluso esplicitamente un comando di stampa nella nostra sezione comandi. Quindi ogni riga viene stampata due volte. Ma non preoccuparti. SED ha l'estensione-nopzione per sopprimere la stampa predefinita del buffer del motivo. Il comando seguente lo illustra.
[jerry]$ sed -n 'p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
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
Congratulazioni! abbiamo ottenuto il risultato atteso. Per impostazione predefinita, SED opera su tutte le linee. Ma possiamo costringere SED ad operare solo su determinate linee. Ad esempio, nell'esempio seguente, SED opera solo sulla 3a linea. In questo esempio, abbiamo specificato un intervallo di indirizzi prima del comando SED.
[jerry]$ sed -n '3p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
3) The Alchemist, Paulo Coelho, 197
Inoltre, possiamo anche istruire SED a stampare solo alcune righe. Ad esempio, il codice seguente stampa tutte le righe da 2 a 5. Qui abbiamo usato l'operatore virgola (,) per specificare l'intervallo di indirizzi.
[jerry]$ sed -n '2,5 p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
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
C'è anche un carattere speciale Dollar ($) che rappresenta l'ultima riga del file. Quindi stampiamo l'ultima riga del file.
[jerry]$ sed -n '$ p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
6) A Game of Thrones, George R. R. Martin, 864
Tuttavia possiamo anche usare il carattere Dollar ($) per specificare l'intervallo di indirizzi. L'esempio seguente stampa dalla riga 3 all'ultima riga.
[jerry]$ sed -n '3,$ p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
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
Abbiamo imparato come specificare un intervallo di indirizzi utilizzando l'operatore virgola (,). SED supporta altri due operatori che possono essere utilizzati per specificare l'intervallo di indirizzi. Il primo è l'operatore più (+) e può essere utilizzato con l'operatore virgola (,). Per esempioM, +n stamperà il prossimo n righe che iniziano dal numero di riga M. Sembra confuso? Controlliamolo con un semplice esempio. L'esempio seguente stampa le 4 righe successive a partire dalla riga numero 2.
[jerry]$ sed -n '2,+4 p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
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
Facoltativamente, possiamo anche specificare l'intervallo di indirizzi utilizzando l'operatore tilde (~). UtilizzaM~nmodulo. Indica che il SED deve iniziare dalla riga numero M ed elaborare ogni n (esima) riga. Per esempio,50~5corrisponde ai numeri di riga 50, 55, 60, 65 e così via. Stampiamo solo righe dispari dal file.
[jerry]$ sed -n '1~2 p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
1) A Storm of Swords, George R. R. Martin, 1216
3) The Alchemist, Paulo Coelho, 197
5) The Pilgrimage, Paulo Coelho, 288
Il codice seguente stampa solo le righe pari dal file.
[jerry]$ sed -n '2~2 p' books.txt
Quando il codice precedente viene eseguito, produrrà il seguente risultato.
2) The Two Towers, J. R. R. Tolkien, 352
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
6) A Game of Thrones, George R. R. Martin, 864