Chi utilizza una distribuzione Linux e in generale un sistema operativo Unix-like può avvantaggiarsi dei servigi di sed, un potente strumento per la manipolazione del testo che risulta particolarmente utile in molteplici contesti. Il comando può essere utilizzato per sostituire del testo, eliminare righe e svolgere altre operazioni in modo automatizzato. Se state cercando una specifica stringa di caratteri in un file, anche di ampie dimensioni, e volete sostituirla con qualcos’altro, sed è lo strumento da usare. Anche se le sue abilità non si fermano certo qui.
Cos’è sed e come funziona
L’appellativo sed è abbreviazione di stream editor: si tratta di un’utilità a riga di comando che si rivela utilissima in molteplici occasioni. Vi abbiamo già detto della difficoltà di molti editor di testo con i file di grandi dimensioni, no? Il comando sed si comporta come una sorta di regista: le righe di testo sono gli attori, le istruzioni fornite dall’utente la sceneggiatura.
La specialità di sed risiede, come abbiamo già evidenziato, nella sostituzione delle parole e quindi nella trasformazione di stringhe. Dalla semplice sostituzione di una stringa in tutto il testo all’eliminazione delle linee vuote, sed si adatta a qualsiasi ruolo. Parla un linguaggio proprio, un misto di comandi imperativi ed espressioni regolari.
Il comando sed può anche “viaggiare nel tempo”, consentendo la creazione di copie di sicurezza e facilitandone il ripristino, in modo da mettere l’utente nelle condizioni di ripristinare il contenuto di qualsiasi file in caso di problemi o errori.
Perché sed è utile anche in Windows
Purtroppo, i sistemi operativi Windows non integrano un comando potente tano quanto sed. C’è findstr
ma esso si limita a esaminare una singola riga mentre PowerShell offre la cmdlet Get-Content
e l’espressione -replace
ma in entrambi i casi è necessari ingegnarsi con l’utilizzo di appositi batch e script.
Attivando WSL (Windows Subsystem for Linux) su Windows 10 e Windows 11, è possibile usare Linux in Windows beneficiando di una perfetta integrazione con il sistema operativo Microsoft.
Installando ad esempio Ubuntu in WSL (o qualunque altra distribuzione Linux), si ha la possibilità di accedere al comando sed anche da Windows. Premendo Windows+R
, digitando \\WSL$
quindi portandosi nella directory home
del proprio account utente Linux, si possono copiare file di testo da elaborare dalla finestra di WSL con il comando sed.
Esempi di utilizzo del comando sed
Il miglior modo per apprendere come funziona un comando è partire da esempi concreti. L’istruzione seguente consente di sostituire tutte le occorrenze di stringaA
con stringaB
:
sed -i 's/stringaA/stringaB/g' file.txt
Al posto di stringaA
con stringaB
: vanno ovviamente indicate le parole da sostituire nel file file.txt
. L’opzione -i
indica a sed di modificare il file di testo direttamente, senza creare un file di backup. Gli interventi sono quindi apportati sul contenuto dell’oggetto chiamato file.txt
e memorizzato nella cartella in cui ci si trova.
Supponiamo di prendere il testo dei Promessi Sposi e salvarlo come file di testo: si tratta di un file che pesa circa 1,2 MB e contiene poco meno di 3.000 righe. Digitando quanto segue, sed crea un nuovo file (notare l’assenza dell’opzione -i
) con il nome Renzo sostituito da Mario:
sed 's/Renzo/Mario/g' promessi-sposi.txt > promessi-sposi-modificato.txt
Nel file di testo promessi-sposi-modificato.txt
, Renzo Tramaglino è diventato Mario Tramaglino. Il buon Manzoni ci scuserà.
Nel caso in cui si volessero effettuare le opportune sostituzioni senza considerare la differenza tra lettere maiuscole e minuscole, è sufficiente utilizzare la sintassi gi
nel comando:
sed -i 's/stringadatrovare/stringadasostituire/gi' file.txt
Nello specifico:
g
: Sta per “global” e indica di effettuare la sostituzione in modo globale all’interno di ogni riga.i
: Sta per “case-insensitive” (senza distinzione tra maiuscole e minuscole). Questo significa che la sostituzione sarà insensibile alle differenze tra maiuscole e minuscole.
Come sostituire il testo che si trova su righe specifiche
Negli esempi precedenti, abbiamo visto come effettuare delle sostituzioni automatiche sull’intero contenuto di un file di testo. Il comando che segue fa in modo che sed prenda in considerazione solo il contenuto delle righe dalla numero 50 alla numero 150: l’intervallo è ovviamente personalizzabile a proprio piacimento.
sed -i '50,150s/stringadatrovare/stringadasostituire/g' file.txt
Inserire del testo dopo una certa riga
Il comando sed è come un “coltellino svizzero”: si adatta a ogni necessità legata alla gestione dei file di testo. Senza dover aprire alcun editor, è possibile chiedere a sed di aggiungere un testo dopo una certa riga. Per farlo, basta digitare quanto segue:
sed -i '50i\3rd line' file.txt
La parte dell’istruzione 50i\
indica che si desidera importare nel file di testo quanto specificato dopo la barra, subito al di sopra della riga numero 50.
Estrarre il contenuto di alcune righe del file di testo
Spesso si ha a che fare con file di testo di grandi dimensioni. Può risultare complesso estrarre il contenuto di righe di testo specifiche o, addirittura, individuare le sole righe di testo che contengono stringhe specifiche.
Se riprendiamo il testo dei Promessi Sposi, quanto di seguito consente di estrarre il contenuto delle sole righe 1000-1010:
sed -n '1000,1010p' promessi-sposi.txt
Il comando seguente, invece, consente di estrarre e visualizzare le sole righe che contengono le stringhe Renzo o Lucia:
sed -n '/Renzo\|Lucia/p' promessi-sposi.txt
Quanto rappresentato tra virgolette, è un’espressione regolare che corrisponde a tutte le righe che contengono la stringa “Renzo” o “Lucia”. L’operatore \|
funziona come un operatore logico OR.
Eliminare tutte le righe che contengono una stringa
Allo stesso modo, sed '100,110d' file.text > nuovo-file.txt
consente di eliminare le righe da 100 a 110 creando un nuovo file di testo mentre il comando che segue permette di cancellare tutte le righe che contengono la stringa di caratteri indicata:
sed -i '/stringa/d' file.txt
È sempre bene porre la massima attenzione all’utilizzo dell’opzione -i
che, come spiegato, applica le modifiche direttamente sul file di testo originale, senza creare copie di backup.
Per eliminare le righe vuote da un file di testo, invece, si può usare l’istruzione seguente: sed '/^$/d' file.txt
Come aggiungere nuove informazioni alla fine di un file
Quando si lavora con i file di testo, può essere utile aggiungere nuove righe senza aprire un editor “ad hoc”. Ciò risulta utile soprattutto con i file di configurazione di grandi dimensioni.
Il semplice comando sed -i '$a\nuova riga da aggiungere' file.txt
consente di aggiungere una nuova riga alla fine del file mentre ad esempio sed '15a\nuova riga da aggiungere' file.txt
effettua l’aggiunta dopo la 15esima riga.