CodeGym /Corsi /Docker SELF /Trasformazione di testo con sed

Trasformazione di testo con sed

Docker SELF
Livello 8 , Lezione 1
Disponibile

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 che sed 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.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION