Operazioni con SED

SED = Stream EDitor.

In uno script ho avuto necessità di utilizzare il comando "sed" quindi ecco alcuni appunti a riguardo.
Ovviamente riporto solo le parti a cui mi sono interessato, se in futuro approfondirò altre opzioni o sintassi particolari integrerò l'articolo.
Tengo a precisare che linux è un mare di potenza, mi spiego meglio: moltissime volte la stessa cosa si può eseguire in diversi modi, perciò, molte delle operazioni che può effettuare il comando "sed" possono essere eseguite anche con altri comandi, come per esempio "grep" o anche un semplice comando di redirezione ">>" ecc.

 

Alcune opzioni:

-i
Questa opzione significa in-place editing e serve per premettere al comando di applicare direttamente le modifiche al file originale. Quindi attenzione al suo utilizzo!!!
Eventualmente è possibile specificare l'opzione "-i" modificandola in "-i.bak".
Questa sintassi creerà un file di back-up prima di apportare le modifiche al file originale.
La dicitura ".bak" è solo un esempio, potrebbe essere qualsiasi stringa di testo, questa sarà semplicemente il suffisso assegnato al file creato in copia.

-e  (  ;  /  -f  )
Il comando sed può effettuare una sola sostituzione per volta. Questa opzione serve se si desidera utilizzare più di un set di istruzioni sulla stessa riga di comando.
Praticamente, senza questa opzione, nel caso siano previste più istruzioni, il comando sed non distinguerà se il secondo valore sia un'istruzione o il nome del file di input.
NOTA: Si possono eseguire più comandi anche separandoli da un ";" (punto e virgola) oppure creando un file di testo contenente in ogni riga il comando da eseguire.

 

Alcuni comandi:

a\  : Append. Inserisce del testo al di sotto della riga corrente.
c\  : Change. Modifica del testo della riga corrente.
d   : Delete. Cancella del testo.
i\   : Insert. Inserisce del testo sopra alla riga corrente.
p   : Print. Stampa del testo.
r    : Read. Legge un file.
s   : Search. Cerca e modifica del testo.

 

Alcune precisazioni:

- Se non si specificano azioni, sed stampa sullo standard output le righe in input, lasciandole inalterate.
- Se non viene specificato un indirizzo o un intervallo di indirizzi di linea su cui eseguire l’azione, quest’ultima viene applicata a tutte le righe in input.
- Gli indirizzi di linea si possono specificare come numeri o espressioni regolari.
- Se vi è più di un’azione (comandi multipli), esse possono essere specificate sulla riga di comando precedendo ognuna con l’opzione -e, oppure possono essere lette da un file esterno specificato sulla linea di comando con l’opzione -f.

 

 

Alcuni esempi:

Negli esempi che seguono, file.txt è il file da modificare ed elenco.txt è il file che contiene le azioni per eseguire più comandi.

 

Comando 'p' (stampa)

Stampa tutte le righe del file e quelle dalla riga 2 alla riga 5 vengono ripetute:

sed '2,5p' ./file.txt


Stampa tutte le righe del file e quelle che contengono "parola" vengono ripetute:

sed '/parola/p' ./file.txt


Se ai comandi precedenti aggiungiamo l'opzione -n vengono visualizzate solo le righe interessate:

sed -n '/parola/p' ./file.txt

 
Se aggiungiamo l'opzione -i verranno anche apportate le modifiche al file "file.txt":

sed -n -i '/parola/p' ./file.txt

 

Comando 'd' (cancella)

Elimina le righe contenenti "parola":

sed '/parola/d' ./file.txt


Esclude le righe che iniziano (^) con "parola":

sed '/^parola/d' ./file.txt


Elimina la seconda riga:

sed '2d' ./file.txt


Elimina dalla riga 2 alla riga 5:

sed '2,5d' ./file.txt


Elimina dalla riga 5 all'ultima riga, identificata con $:

sed '5,$d' ./file.txt


Elimina solo l'ultima riga:

sed '$d' ./file.txt


Elimina una sequenza regolare di righe dopo aver determinato la prima. Cioè, il primo numero indica la prima linea da eliminare, il secondo invece stabilisce la sequenza:

sed '1~2d' ./file.txt


Elimina due righe non consecutive, la riga 1 e la riga 8:

sed '1d;8d' ./file.txt


Elimina una serie di righe e una non consecutiva, dalla riga 3 alla riga 6 e la riga 8:

sed '3,6d;8d' ./file.txt


Elimina le righe vuote:

sed '/^$/d' ./file.txt
sed '/./!d' ./file.txt


Rimuove le righe che contengono cifre, almeno 1 cifra, situata a fine riga:

sed '/[0-9/][0-9]*$/d' ./file.txt 



Comando 'a' (aggiungi dopo)

Aggiunge "frase o parola da aggiungere" dopo la riga 2:

sed '2a frase o parola da aggiungere' ./file.txt


Oppure, lo stesso risultato si può ottenere così:

sed '/2/a frase o parola da aggiungere' ./file.txt

 

Comando 'i' (aggiungi prima)

Aggiunge "frase o parola da aggiungere" prima della riga 3:

sed '3i frase o parola da aggiungere' ./file.txt

 

Ricerca e Sostituzione

Sostituisce ogni ricorrenza di "testo da sostituire" con "nuovo testo":

sed 's/testo da sostituire/nuovo testo/' ./file.txt


Con l'aggiunta dell'opzione '-e' per ogni comando, oppure separando i comandi con un ";" (punto e virgola) possiamo aggiungere altri comandi:

sed -e 's/uno/dieci/' -e 's/cinque/cinquanta/' ./file.txt
sed 's/uno/dieci/; s/cinque/cinquanta/' ./file.txt

 
Aggiunge all'inizio (^) di ogni riga "parola":

sed 's/^/parola/' ./file.txt


Aggiunge alla fine ($) di ogni riga "parola":

sed 's/$/parola/' ./file.txt

 
Per quanto riguarda l'esecuzione di più comandi, al posto di utilizzare l'opzione "-e" o il ";" (punto e virgola) per separarli, possiamo usare un file passato come parametro.
Ad esempio, basta creare un file (elenco.txt) con una sequenza di comandi da eseguire (senza i soliti apici degli esempi precedenti), del tipo:

s/riga/righe/
s/parola/parole/
s/^/> /
s/$/./

ed eseguire sed con questa sintassi:

sed -f ./elenco.txt ./file.txt

 

Per ora direi che è tutto.
Seguiranno eventuali aggiornamenti.