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