Trasformazione di testo con sed
1. Sintassi del comando sed
Che cos'è sed
?
sed
(abbreviazione di Stream Editor, cioè editor di flussi) è un potente strumento per elaborare il testo, che permette di modificare, aggiungere, eliminare o trasformare righe in file di testo e flussi di dati.
La magia principale di sed
sta nel fatto che modifica i testi "al volo", senza toccare il file originale (a meno che non glielo chiedi esplicitamente). Questo lo rende uno strumento perfetto per trasformazioni rapide e automatiche dei dati.
Sintassi di base del comando
Prendiamo la formula base per lavorare con sed
:
sed [opzioni] 'modello/azione' file
Dove:
modello
— è il testo o l'espressione regolare che sarà usata per la ricerca.azione
— l'operazione che vuoi effettuare (ad esempio, sostituzione del testo).file
— il file di testo che contiene le righe che vuoi modificare.
Per semplicità, all'inizio ci concentreremo sulle azioni più popolari: sostituzione del testo (s
— dalla parola "substitute") e cancellazione di righe (d
— dalla parola "delete").
2. Sostituzione del testo s/vecchio/nuovo/
Esempio 1: Sostituzione semplice del testo
Supponiamo di avere un file example.txt
con il contenuto:
Hello world!
Welcome to Linux.
Linux is awesome.
Proviamo a sostituire la parola "Linux" con sed
:
sed 's/Linux/sed/' example.txt
L'output sarà il seguente:
Hello world!
Welcome to sed.
sed is awesome.
Ecco fatto. La parola "Linux" è stata sostituita con sed
solo una volta in ogni riga. Questo è il comportamento standard.
Esempio 2: Sostituzione globale
Se hai bisogno di sostituire tutte le occorrenze della parola invece della prima in una riga, aggiungi il flag g
(globale):
sed 's/Linux/sed/g' example.txt
Se una riga contiene più occorrenze di "Linux", tutte saranno sostituite da sed
.
Esempio 3: Ignorare le maiuscole
Per sostituire il testo ignorando le maiuscole, aggiungi il flag I
(o i
a seconda della versione):
sed 's/linux/sed/gi' example.txt
Questo sostituirà le parole "Linux", "LINUX", "LiNuX" ecc.
Esempio 4: Sostituzione con salvataggio
Di default, sed
stampa solo il risultato nella console senza modificare il file. Se vuoi scrivere le modifiche direttamente nel file, aggiungi l'opzione -i
(in-place):
sed -i 's/Linux/sed/g' example.txt
Ora il file example.txt
sarà aggiornato con le sostituzioni.
3. Eliminazione di righe /pattern/d
Esempio 1: Eliminazione di righe tramite pattern
Se vuoi eliminare tutte le righe che contengono la parola "Linux":
sed '/Linux/d' example.txt
L'output sarà il seguente:
Hello world!
Qui sono state eliminate le righe in cui appare "Linux".
Eliminazione di righe per numero
Puoi eliminare una riga in base al suo numero. Ad esempio, per eliminare la seconda riga, usiamo:
sed '2d' example.txt
Output:
Hello world!
Linux is awesome.
Per eliminare più righe: specifica un intervallo, ad esempio, per eliminare le righe dalla 2ª alla 3ª:
sed '2,3d' example.txt
4. Lavorare con espressioni regolari
Ecco dove sed
splende con tutta la sua potenza! Nei pattern puoi usare le espressioni regolari per cercare corrispondenze più complesse.
Esempio 1: Sostituzione di parole con un pattern specifico
Supponiamo che nel testo ci siano le seguenti linee:
error: qualcosa è andato storto
warning: controlla il tuo sistema
error: impossibile connettersi
Vogliamo sostituire tutte le righe che iniziano con "error" con "Problema Rilevato". Qui ci vengono in aiuto le espressioni regolari:
sed 's/^error:.*/Problema Rilevato/' logs.txt
Dove:
^
— indica l'inizio della riga..*
— significa "qualsiasi cosa dopo".
Risultato:
Problema Rilevato
warning: controlla il tuo sistema
Problema Rilevato
5. Inserire e aggiungere righe
Inserire una riga prima di una corrispondenza
Per inserire una riga prima di ogni riga che contiene "Linux":
sed '/Linux/i\# Learning is fun' example.txt
Risultato:
Hello world!
Welcome to Linux.
# Learning is fun
Linux is awesome.
Esempio 2: Aggiungere una riga dopo una corrispondenza
Per aggiungere testo dopo una riga con un pattern:
sed '/Linux/a\# sed makes it easier' example.txt
Risultato:
Hello world!
Welcome to Linux.
# sed makes it easier
Linux is awesome.
# sed makes it easier
6. Pratica: elaborazione dei file di configurazione
Proviamo a risolvere un compito pratico. Immagina di avere un file di configurazione config.txt
:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
Compito 1: Sostituire "localhost" con "127.0.0.1"
sed -i 's/localhost/127.0.0.1/' config.txt
Risultato:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
Compito 2: Incrementare la porta di 1
Per fare ciò, utilizziamo sed
con un piccolo trucco:
sed -i 's/port=8080/port=8081/' config.txt
Risultato:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
Compito 3: Eliminare le righe con logfile
Se la configurazione non richiede più la registrazione dei log, eliminiamo la riga:
sed -i '/logfile/d' config.txt
Risultato:
host=127.0.0.1
port=8081
mode=production
7. Combinazione con altri comandi
sed
funziona benissimo in combinazione con altri strumenti di Linux. Per esempio:
grep "error" logs.txt | sed 's/error/ERROR/'
Qui prima cerchiamo righe con errori e poi le formattiamo.
Errori tipici e come evitarli
- Errore: dimenticato l'opzione
-i
. I principianti spesso si aspettano chesed
modifichi il file, ma non aggiungono-i
. Ricordati di specificarlo esplicitamente se vuoi modificare il file. - Errore: virgolette. Su alcuni sistemi, specialmente se si usano le virgolette singole,
\
davanti ai caratteri speciali può non funzionare correttamente. Assicurati sempre di fare il escaping corretto dei caratteri. - Errore con i range delle righe. Se utilizzi dei range (per esempio,
2,3d
), assicurati che siano specificati correttamente — il file non deve essere vuoto.
GO TO FULL VERSION