GUIDA A SED, 04 – stampa selettiva

STAMPA SELETTIVA

$ cat file1
europa italia roma
asia cina pechino
usa washington washington

Stampare intero contenuto:

$ sed '' file1
europa italia roma
asia cina pechino
usa washington washington

Stampare solo la linea che contiene cina:

$ sed '/cina/p' file1
europa italia roma
asia cina pechino
asia cina pechino
usa washington washington

Studiamo l’output: sed di default stampa tutte le righe del file. Quindi stampa la stringa due volte: una perchè matcha con il pattern indicato, l’altra perchè di default stampa comunque tutte le linee. Per ovviare a questo inconveniente aggiungiamo lì’opzione “-n” con la quale indichiamo di stampare solo le stringhe che matchano con il pattern:

$ sed -n '/cina/p' file1
asia cina pechino

Cancellare la linea contenente “cina”:

$ sed '/cina/d' file1
europa italia roma
usa washington washington

Cancellare la prima riga:

$ sed '1d' file1
asia cina pechino
usa washington washington

Stampare tutte le linee fino a quando si incontra un certo pattern:

$ sed '/cina/q' file1
europa italia roma
asia cina pechino

“q” -> indica a sed di uscire quando viene matchato il pattern. La riga con il pattern viene letta e poi sed esce.

Stampa un range di linee:

$ sed -n '2,3p' file1
asia cina pechino
usa washington washington

Stampa il range dalla riga 2 alla riga 3

Posso usare anche il flag “q” per uscire dopo aver matchato il pattern.

$ sed '2q' file1
europa italia roma
asia cina pechino

Sed esce dopo aver letto la seconda riga

Stampa il range di linee che matchano con due pattern:

$ sed -n '/europa/,/pechino/p' file1
europa italia roma
asia cina pechino

NB se il secondo pattern non matcha con nulla, sed procede comunque fino alla fine del file:

$ sed -n '/europa/,/russia/p' file1
europa italia roma
asia cina pechino
usa washington washington

Stampa dalla linea che matcha col pattern fino alla fine del file:

$ sed -n '/cina/,$p' file1
asia cina pechino
usa washington washington

Stampa dall’inizio del file fino alla linea che matcha col pattern:

$ sed -n '1,/pechino/p' file1
europa italia roma
asia cina pechino

NB: è importante capire che sed non compie alcuna verifica prima di leggere il file. Semplicemente legge riga per riga e compie le operazioni indicate quando il pattern matcha con una riga. Ad esempio guardate cosa succede se indico a sed di stampare le stringhe dalla seconda riga al match con “pechino”. Potremmo pensare che stampi solo la seconda riga, invece saremo sorpresi di vedere che l’output sarà:

$ sed -n '2,/pechino/p' file1
asia cina pechino
usa washington washington

Sed infatti ha letto fino alla seconda riga, ha stampato la seconda riga in quanto primo valore del range, è passato alla riga seguente e ha stampato tutto non trovando alcun match con “pechino”.

———————————————-

INDICE

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>