Gli utenti di Linux e delle sue numerose di­stri­bu­zio­ni lavorano a livello di riga di comando, chi oc­ca­sio­nal­men­te e chi re­go­lar­men­te, poiché alcuni processi possono essere eseguiti più ve­lo­ce­men­te o in maniera più ef­fi­cien­te tramite il terminale piuttosto che tramite l’in­ter­fac­cia grafica. Tuttavia, a tale scopo, bisogna conoscere i vari comandi e il loro fun­zio­na­men­to. Uno di questi comandi in Linux è 'sed'.

Stream Editor (sed) si distingue da un consueto editor di testo. In Linux, SED è un comando che può essere uti­liz­za­to per leggere e adattare i flussi di dati, pertanto lo strumento è usato prin­ci­pal­men­te nella pro­gram­ma­zio­ne della shell. Ma come funziona?

Per cosa è uti­liz­za­to SED in Linux?

Il comando “sed” fa parte della dotazione di base di ogni in­stal­la­zio­ne di Linux, poiché ap­par­tie­ne alle GNU Core Utilities (coreutils). Si tratta di un editor di testo non in­te­rat­ti­vo che non apporta modifiche dirette al file che si sta mo­di­fi­can­do ma che permette di creare prima un file tem­po­ra­neo il cui contenuto viene poi tra­sfe­ri­to al file di origine. SED procede riga per riga: ogni riga del file viene letta in­di­vi­dual­men­te, elaborata e poi ri­pro­dot­ta. La funzione più im­por­tan­te di SED è quella di cercare de­ter­mi­na­te stringhe di caratteri nel file e poi so­sti­tuir­le con altri caratteri.

In questo modo, usando un solo comando è possibile cambiare in maniera so­stan­zia­le un intero file quasi au­to­ma­ti­ca­men­te. In­te­gran­do tali comandi in uno shell scripting, infatti, si sem­pli­fi­ca­no no­te­vol­men­te tutti i processi ri­don­dan­ti. Per esempio, in questo modo è possibile curare i database o un codice sorgente esteso, poiché invece di mo­di­fi­ca­re ogni voce a mano, con SED si può lavorare sull’intero file in una sola volta.

Sintassi e funzione del comando SED

Il comando SED lavora uti­liz­zan­do ese­gui­bi­li e si applica ai file. La fun­zio­na­li­tà dei comandi (anche dello stesso SED) può essere estesa tramite co­sid­det­te “opzioni”.

sed [opzione(i)] 'comando(i)' [file]

Potete inserire le opzioni di­ret­ta­men­te all’interno del comando oppure eseguirli da un file. In tal caso, dovrete indicare il percorso del file al posto del comando.

Opzioni

Come di consueto per i comandi Linux, anche SED offre la pos­si­bi­li­tà di fissare parametri. Questi ultimi sono par­ti­co­lar­men­te im­por­tan­ti per il comando SED, poiché solo tramite di essi si rende chiaro come debba essere in­ter­pre­ta­to il comando indicato. Si tratta delle seguenti opzioni:

Opzione Spie­ga­zio­ne
-e Quando è uti­liz­za­to uno o più script SED.
-f Quando lo script è stato estratto da un file.
-n I risultati non sono pre­sen­ta­ti.
-i Crea un file tem­po­ra­neo che so­sti­tui­sce il file di origine.
-u Non viene inserito un buffer di dati.
-s Più file vengono elaborati sin­go­lar­men­te invece che in un unico flusso di dati.
-r Il comando accetta termini regolari estesi.

Le opzioni -e e -f sono le più im­por­tan­ti. Indicano se il comando è interno (e in tal caso si tratta di uno script SED) o se il comando debba fare ri­fe­ri­men­to a un file ag­giun­ti­vo. Spesso si può fare a meno dell’opzione -e, poiché è il caso standard. Tuttavia, se includete più di un comando allo stesso tempo, l’opzione deve essere attivata.

N.B.

Se usate l’opzione -e, il parametro deve essere scritto di­ret­ta­men­te prima del primo comando. Se usate altre opzioni, scri­ve­te­le prima del primo comando. Se includete altri comandi nel comando, inserite l’opzione anche davanti a essi.

L'opzione -n è molto im­por­tan­te, e pro­ba­bil­men­te in­di­spen­sa­bi­le per il vostro lavoro. Se il parametro non è impostato, ogni singola riga del file di testo letto sarà vi­sua­liz­za­ta sul terminale, il che non è molto utile, spe­cial­men­te con grandi database. Se invece si attiva l’opzione, verranno vi­sua­liz­za­te solo le righe in­te­res­sa­te dal comando.

Comandi

Con un comando dite al comando cosa fare con il file sorgente tenendo conto delle opzioni spe­ci­fi­ca­te.

Comando Spie­ga­zio­ne
a append: aggiunge una o più righe alle righe se­le­zio­na­te.
c change: so­sti­tui­sce le righe se­le­zio­na­te con un nuovo contenuto.
d delete: elimina le righe se­le­zio­na­te.
g get: copia il contenuto da hold space in pattern space.
G Get­New­li­ne: aggiunge il contenuto hold space a pattern space.
h hold: copia il contenuto di pattern space in hold space.
H Hold­New­Li­ne: aggiunge il contenuto di pattern space a hold space.
i insert: aggiunge una o più righe prima della riga se­le­zio­na­ta.
l listing: mostra tutti i caratteri non stam­pa­bi­li.
n next: passa al comando suc­ces­si­vo per la riga suc­ces­si­va.
p print: mostra le righe se­le­zio­na­te.
q quit: termina il comando SED.
r read: legge le righe se­le­zio­na­te di un file.
s sub­sti­tu­te: so­sti­tui­sce una sequenza di caratteri pre­de­fi­ni­ta con un’altra.
x xchange: scambia pattern space e hold space tra loro.
y yank: so­sti­tui­sce un carattere pre­de­fi­ni­to con un altro.
w write: scrive righe in un file di testo.
! Negation: applica il comando sulle righe che non cor­ri­spon­do­no all’in­se­ri­men­to.
Fatto

I due tipi di memoria hold space e pattern space hanno compiti dif­fe­ren­ti: pattern space descrive una memoria di lavoro a breve termine all’interno del quale si trovano i dati con i quali il comando sta lavorando. hold space è invece a lungo termine e contiene dati ai quali è possibile accedere anche quando SED è occupato a eseguire un’altra ope­ra­zio­ne.

I comandi sono esten­di­bi­li con ulteriori opzioni:

Opzione De­scri­zio­ne
= Indica il numero di riga della riga se­le­zio­na­ta.
p Emette le righe mo­di­fi­ca­te.
g Applica il comando all’intero file.
Fatto

Aprite e chiudete i comandi con vir­go­let­te semplici per evitare che l’in­se­ri­men­to debba essere rein­ter­pre­ta­to. Di per sé i caratteri non sarebbero necessari, tuttavia in questo modo con­tri­bui­te a ridurre molte fonti di errore.

Espres­sio­ni regolari

Per l’utilizzo di SED è im­por­tan­te la com­pren­sio­ne di espres­sio­ni regolari. Questi caratteri servono a co­mu­ni­ca­re al comando come com­por­tar­si in presenza di una sequenza di caratteri. Ad esempio, sono im­por­tan­ti le parentesi quadre e tonde:

  • [ABC]: Una classe di caratteri si utilizza quando si cerca una cor­ri­spon­den­za all’interno di un gruppo di lettere, cifre e simboli; pertanto A, B o C.
  • (ABC): Un gruppo di caratteri descrive un termine fisso; pertanto ABC in questa sequenza.

Le wildcard per­met­to­no di cercare anche solo parti di termini con le espres­sio­ni regolari. Potete applicare due varianti diverse:

  • .: il punto so­sti­tui­sce esat­ta­men­te un carattere.
  • *: l’asterisco so­sti­tui­sce più caratteri a pia­ci­men­to.

Inoltre le espres­sio­ni regolari vi con­sen­to­no di stabilire più pre­ci­sa­men­te la frequenza di caratteri (o com­bi­na­zio­ni di).

  • ?: il punto in­ter­ro­ga­ti­vo indica che un termine debba comparire una volta o mai.
  • +: il più sta­bi­li­sce che il carattere debba comparire più volte e almeno una volta.
  • {0,n}: con una cifra all’interno di parentesi graffe stabilite con pre­ci­sio­ne con quanta frequenza debba comparire la com­bi­na­zio­ne di caratteri. Se inserite due valori separati da una virgola, stabilite le ri­pe­ti­zio­ni minimali e massimali.

Infine, uti­liz­zan­do Linux e SED potete includere anche caratteri logici che possono ad esempio aiutarvi a creare con­nes­sio­ni o an­ni­da­men­ti.

  • |: una barra verticale si trova tra due termini e sim­bo­leg­gia un’al­ter­na­ti­va tra i due.
  • ^: il cir­con­fles­so scritto di­ret­ta­men­te prima di un termine lo nega; questa sequenza di caratteri non dovrebbe pertanto capitare.

Con questi caratteri mo­di­fi­ca­te quindi l’in­se­ri­men­to all’interno del comando SED e potete portare a termine compiti complessi.

Indirizzi

In Linux SED gli in­se­ri­men­ti sono de­no­mi­na­ti indirizzi. Un indirizzo è quindi l’obiettivo del comando che potete indicare in modi diversi. In molti casi in­se­ri­re­te delle ricerche elaborate con le espres­sio­ni regolari. Tuttavia sussiste anche la pos­si­bi­li­tà di se­le­zio­na­re righe del file di testo. Di con­se­guen­za an­no­te­re­te gli indirizzi in modo diverso.

Nel primo esempio fate ri­fe­ri­men­to a righe concrete:

sed -n '10,50p' testo.txt

Con questo codice vengono emesse sul terminale le righe dalla 10 alla 50.

Se non sapete in quali righe trovare le in­for­ma­zio­ni con cui intendete lavorare, potete anche fare ricercare l’indirizzo. In questo caso è im­por­tan­te che apriate e chiudiate sempre l’espres­sio­ne con una barra obliqua per separare il termine di ricerca da altre in­for­ma­zio­ni come i comandi.

sed -n 'esempio.[1-9]/p' testo.txt

Questo codice vi mo­stre­reb­be tutte le righe indicate come esempio (o esempi) e che terminano con una cifra.

SED spiegato per mezzo di tre esempi

Il comando SED può offrire un pronto aiuto nei casi più disparati. In par­ti­co­la­re se dovete apportare più modifiche al contempo a file di testo molto grandi, il tool dimostra la sua forza. Nei seguenti tre esempi vedrete diverse pos­si­bi­li­tà di ap­pli­ca­zio­ne di SED nella quo­ti­dia­ni­tà di Linux.

Ef­fet­tua­re una ricerca all’interno di un file di testo

Il caso di ap­pli­ca­zio­ne più semplice è la ricerca di de­ter­mi­na­ti dati in un documento. Diventa in­te­res­san­te è ad esempio quando si tratta di database di grandi di­men­sio­ni o anche all’interno del codice sorgente. In questo modo si trova ve­lo­ce­men­te un punto da leggere o anche mo­di­fi­ca­re.

Mettiamo il caso che voleste cercare le bottiglie di vino Mon­te­pul­cia­no all’interno della vostra notevole cantina di vini. In aggiunta, de­si­de­ra­te anche che venga mostrata la prima riga del database in cui sono spiegate le singole colonne. Il seguente comando vi aiuta a trovare la posizione delle bottiglie:

sed -n -e '1p' -e '/Montepulciano/p' vino.txt

Qui uti­liz­za­te due comandi uno dietro l’altro. Entrambi sono in­tro­dot­ti da -e. Il risultato avrà il seguente aspetto:

Scaffale Zona di produzione Vitigno Annata
1 Chieti Montepulciano 2011
2 Pescara Montepulciano 2020
3 Teramo Montepulciano 2018

Se intendete vedere solo le annate degli anni 2010, basta mo­di­fi­ca­re leg­ger­men­te il codice.

sed -n -e '1p' -e '/Montepulciano * 201./p' vino.txt
Scaffale Zona di produzione Vitigno Annata
1 Chieti Montepulciano 2011
3 Teramo Montepulciano 2018

In questo caso la wildcard tra vitigno e annata non è im­por­tan­te. Tuttavia, se il database è in­cor­ret­to o se a po­ste­rio­ri inserite una colonna, l’in­di­ca­zio­ne rimane corretta.

Ag­giun­ge­re in­for­ma­zio­ni

Con Linux e il comando SED potete anche estendere database. E per fare nuovi in­se­ri­men­ti non dovete aprire, mo­di­fi­ca­re e salvare il file con un nuovo editor di testo. Piuttosto apportate la modifica con una sola riga di codice.

Per il nostro esempio ora sup­po­nia­mo che avete ricevuto due nuove bottiglie di vino da ag­giun­ge­re alla vostra col­le­zio­ne e di con­se­guen­za anche al database cor­ri­spon­den­te. Grazie a SED potete inserire una nuova riga alla fine del file di testo.

sed -i -e '$a2 Venosa Aglianico 2015' -e '$a4 Sannio Falanghina 2021' vino.txt

L’espres­sio­ne regolare $ fa in modo che SED salti all’ultima riga. Il comando a provoca l’aggiunta di una nuova riga con il contenuto che segue. Uti­liz­zia­mo l’opzione -i per fare in modo che il file di origine possa essere mo­di­fi­ca­to di­ret­ta­men­te, in al­ter­na­ti­va si potrebbe creare un nuovo database:

sed -e '$a2 Venosa Aglianico 2015' -e '$a4 Sannio Falanghina 2021' vino.txt > vino1.txt

Gestire database

Se si desidera cambiare a po­ste­rio­ri la struttura di grandi database con molti in­se­ri­men­ti, ma­nual­men­te è quasi im­pos­si­bi­le. Linux offre con SED una soluzione veloce. Finora nel vostro file le singole colonne sono separate tra loro da uno spazio. Ora in questo esempio partiamo dal pre­sup­po­sto che vogliate so­sti­tui­re lo spazio con trattino. A tal fine uti­liz­zia­mo il comando s-:

sed -i -e 's/[[:space:]]/-/g' vino.txt

La g alla fine dell’indirizzo fa in modo che il comando venga applicato all’intero file.

Una si­tua­zio­ne simile vi si prospetta se volete ag­giun­ge­re ulteriori in­for­ma­zio­ni all’interno di una riga. Sup­po­nia­mo ad esempio che in­ten­dia­te anche annotare se avete già as­sag­gia­to il vino o meno. Prima di ag­giun­ge­re ulteriori vini sco­no­sciu­ti alla vostra col­le­zio­ne, annotate tutti quelli che conoscete già.

sed -i -e 's/$/-conosciuto/g' vino.txt

Ora l’an­no­ta­zio­ne è stata re­gi­stra­ta a tutte le righe, compresa la prima riga in cui nominate le colonne. Per mo­di­fi­car­lo ef­fet­tua­te una so­sti­tu­zio­ne nella prima riga.

sed -i -e '1s/conosciuto/assaggiato/' vino.txt

Al­ter­na­ti­ve a SED

Linux SED è un comando ef­fi­cien­te con il quale portare a termine molte ope­ra­zio­ni. Tuttavia, alcune possono essere compiute solo a fronte di un dispendio di tempo e lavoro. Ser­ven­do­vi di comandi simili potreste rag­giun­ge­re gli obiettivi in modo più veloce e sicuro.

AWK

AWK si è affermato come sviluppo di SED. Anche in questo caso il comando lavora con espres­sio­ni regolari, offre però in aggiunta delle pos­si­bi­li­tà come le si conoscono in altri linguaggi di pro­gram­ma­zio­ne più complessi. Con AWK potete infatti creare comandi che con­ten­go­no istru­zio­ni if-else o sequenze while-do.

PERL

Mentre AWK si orienta in primo luogo ai linguaggi C, esiste anche un comando che funziona sulla base di PERL. No­no­stan­te si possano creare anche sistemi complessi con questo lin­guag­gio, PERL si adatta anche all’ese­cu­zio­ne di compiti più semplici all’interno del terminale o negli scripting Bash.

TR

Se de­si­de­ra­te tra­sfor­ma­re singoli caratteri all’interno di un file di testo, l’ope­ra­zio­ne sarà più semplice uti­liz­zan­do un altro tipo di comando al posto di SED, TR (ab­bre­via­zio­ne di: translate). Questo comando è stato pensato per so­sti­tui­re lettere, cifre e caratteri speciali con degli altri. In questo modo potete ve­lo­ce­men­te eliminare doppi spazi e adattare scritture in minuscolo/maiuscolo. Mentre con TR è facile portare a termine compiti semplici del genere, per compiti più complessi è meglio con­si­de­ra­re altre soluzioni come SED.

Vai al menu prin­ci­pa­le