Sed è un editor non interattivo progettato per operazioni di editing quando le dimensioni del file rendono impraticabile l’uso di editor interattivi. Per programma non interattivo si intende quello che non consente un immediato riscontro delle operazioni effettuate. Sed è inoltre capace di eseguire script contenenti complesse operazioni di editing, consentendo una maggiore efficienza di qualunque altro editor interattivo.
Il comportamento predefinito di sed è quello di copiare lo standard input ( stdin ) nello standard output ( stdout ), la redirezione dell’input o dell’output ci viene in aiuto per utilizzare file contenenti l’input e destinati all’output. Sed fa uso di due buffer dati: il primo detto “pattern space” su cui vengono effettuati i comandi di editing necessari e l’altro detto “hold area“, inizialmente vuoto, destinato a contenere porzioni di testo che in seguito possono essere recuperate.
A riga di comando sed accetta i seguenti tre parametri:
- -n per specificare le righe su cui effettuare l’output
- -e per considerare l’argomento seguente un comando di editing
- -f per considerare l’argomento successivo come il nome di un file che deve contenere comandi di editing uno per riga
Vediamo una panoramica dei comandi utilizzati da sed:
- d – cancella le righe specificate, ovvero non le trasferisce in output
- n – passa alla riga successiva, eventualmente copiando la riga corrente in output
- a\ – appende in coda alla riga corrispondente
- i\ – come la precedente, viene inserito il testo prima della riga corrispondente
- c\ – come i comandi precedenti, il testo viene sostituito alle righe specificate
- s – consente di fare le sostituzioni nella riga corrispondente
- p – le righe indirizzate vengono subito copiate in output
- w – scrive in file le righe indirizzate
- r – legge il contenuto da file e lo appende alla riga indirizzata
- N – fonde la riga corrente con la successiva
- D – cancella fino al primo carattere newline del pattern space
- P – scrive fino al primo newline del pattern space
- h/H – copia il pattern space nella hold area
- g/G – copia il contenuto della hold area in coda al pattern space
- x – scambia il contenuto della hold area con il pattern space
- ! – applica il comando alle righe che non corrispondono all’indirizzo
- { e } – raggruppa più comandi che devono essere eseguiti sullo stesso indirizzo
- : – posiziona un’etichetta
- b – i comandi verranno applicati dopo l’etichetta
- t – come il precedente solo se è avvenuta una sostituzione sulla riga corrente
- = – scrive in output il numero della riga corrente
- q – copia la riga corrente in output e termina l’esecuzione
Facciamo un esempio pratico di sostituzione, scriviamo su un file di nome test, con il nostro editor preferito, del testo in cui sia contenuta la frase “in questa giornata di sole”. Vogliamo sostituire tutte le occorrenze di “di sole” con “di pioggia”, ecco la sintassi che dobbiamo dare:
sed -i ‘s/di sole/di pioggia/g’ test
Come potete notare abbiamo utilizzato -i con s per sostituire nel testo tutte le occorrenze ( g ); ovviamente come pattern possiamo utilizzare qualsiasi carattere:
sed -i ‘s*di sole*di pioggia*g’ test
Il comando s presenta questa sintassi:
Il flag g in particolare, consente di sostituire tutte le occorrenze di pattern, anziché solo la prima per ogni riga.
Sed è un programma di utilizzo molto complesso con le sue espressioni regolari, ma al tempo stesso molto potente per fare delle sostituzioni su file anche di grandi dimensioni. Per maggiori informazioni vi rimando alla documentazione in linea.
Per compilare il pacchetto sed della nostra distribuzione Linux vi inserisco il file contenente tutti i comandi per scaricare il sorgente, compilarlo e formare il pacchetto, che contiene soltanto il programma sed, quindi è molto piccolo, ma utile e potente che utilizzeremo molte volte per applicare dei cambiamenti soprattutto ai makefile.
<< Lezione Precedente – Inizio Tutorial – Lezione Successiva >>