Come Usare Sed in Linux

Una fotografia di due monitor che mostrano una grande quantità di codice.

Sed è un semplice programma UNIX che non crea né modifica file. Modifica solo i dati che passano attraverso il suo input e presenta i dati modificati sul suo output. Qui, diamo una breve panoramica della filosofia UNIX, vediamo le basi dell’uso di sed e ti mostriamo esempi di come utilizzare il programma per compiti quotidiani.

Indice

  • Le Basi dell’Uso di Sed
    1. Selezionare e Ritoccare Flussi di Testo
    1. Rimuovere Testo da un Flusso di Sed
    1. Aggiungere Nuovo Testo ai Flussi di Sed
    1. Trovare e Sostituire Testo in Sed
    1. Copiare Dati Testuali nello Spazio di Memoria
    1. Usare Etichette per Creare Cicli in Sed
    1. Apportare Modifiche Permanenti in Sed

Le Basi dell’Uso di Sed

Sed è un programma che può leggere e modificare flussi di dati testuali. Questo significa che, a differenza di un normale editor di testo, sed non cambia direttamente i file nel tuo computer. Invece, agisce più come un “filtro” per i dati in arrivo e ti consente di trasformarli nel modo che desideri.

Per iniziare a utilizzare sed, crea prima un file con almeno cinque righe di testo al suo interno. Assicurati che ci sia un carattere di “nuova linea” tra le tue righe:

printf"hello\nmaketecheasier\nworld\nthis\nis\nwonderful\n"> hello.txt

Nota: mentre questa guida utilizza un file di testo multi-riga per dimostrare sed, tutti i comandi secondari nel programma funzioneranno anche su testi provenienti da pipe UNIX.

Il comando generale per sed è qualcosa del genere:

sed[opzione]'{script}'[file di testo]

Una delle funzioni più basilari in sed è il comando secondario n. Funziona leggendo i dati dall’input di sed e posizionandoli nello “spazio di modello” del tuo programma. Questo è un buffer speciale che contiene qualsiasi testo in arrivo prima che sed ne effettui qualsiasi manipolazione:

sed n hello.txt

Un terminale che mostra il contenuto del file

Un’altra delle funzioni di base di sed è il comando secondario p. Simile a n, legge i dati provenienti dall’input di sed e li posiziona nello spazio di modello del programma. Tuttavia, li stampa esplicitamente anche sull’output del tuo terminale.

Usare il comando secondario p può essere confuso per i principianti, poiché eseguirlo con qualsiasi input testuale risulta nella stampa dell’output di sed due volte. Questo perché, per default, sed stampa automaticamente il suo spazio di modello indipendentemente dal fatto che p sia presente o meno:

sed p hello.txt

Un terminale che mostra l'output del comando p senza il flag -n.

Per disabilitare questo comportamento bizzarro, aggiungi il flag -n prima di eseguire i tuoi comandi secondari di sed:

sed-n p hello.txt

Un terminale che mostra l'output del comando p con il flag -n abilitato.

Con le basi fuori mano, le sezioni successive esamineranno i diversi modi in cui puoi usare sed per manipolare i dati testuali.

1. Selezionare e Ritoccare Flussi di Testo

Oltre a stampare, puoi anche usare sed per selezionare e ritoccare il testo sia dai flussi di dati che dai file. Il modo più semplice per farlo è aggiungere un valore di intervallo al comando secondario p.

Il seguente comando utilizza la sintassi di intervallo di sed per stampare dalla terza alla quinta riga nel tuo file “hello.txt”:

sed-n'3,5p' hello.txt

Un terminale che mostra la capacità di sed di stampare specifici intervalli di righe.

Puoi anche usare il comando secondario p per stampare righe non adiacenti nel tuo testo. Ad esempio, il seguente stampa la prima e la quarta riga nel file “hello.txt”:

sed-n'1p; 4p' hello.txt

2. Rimuovere Testo da un Flusso di Sed

Sed può anche eliminare dati da qualsiasi flusso di testo in arrivo. Questo è utile se vuoi rimuovere alcune righe di testo da un grande file o pulire l’output di un programma per mostrare solo le informazioni di cui hai bisogno.

Per farlo, utilizza il comando secondario d insieme alla riga o all’intervallo specifico che vuoi eliminare:

sed-n'2d; 5d; p' hello.txt

Un terminale che mostra il processo di eliminazione di righe non adiacenti utilizzando sed.

Simile alla stampa di righe di testo, il comando secondario d funziona anche con intervalli multi-linea. Ad esempio, il seguente comando eliminerà le prime quattro righe dal file “hello.txt”:

sed-n'1,4d; p' hello.txt

Oltre a corrispondere a intervalli di righe specifici, puoi usare espressioni regolari per trovare il testo che vuoi eliminare. Fare questo dirà a sed di cercare qualsiasi riga che contenga la parola “world” e di eliminarla:

sed-n'/world/ d; p' hello.txt

Puoi anche trattare le espressioni regolari come un intervallo per il tuo file di input. Questo ti offre maggiore flessibilità nel definire le tue selezioni all’interno del programma:

sed-n'/world/,/wonderful/ d; p' hello.txt

Un terminale che mostra la capacità di sed di eliminare righe di testo in base a un modello regex.

3. Aggiungere Nuovo Testo ai Flussi di Sed

Oltre a eliminare testo, sed è anche in grado di aggiungere nuovo testo a flussi di dati esistenti. Anche se non è al livello di un editor di testo completo, questa funzione può comunque essere utile per modifiche occasionali e aggiunte di testo di base.

Per aggiungere una nuova riga di testo, esegui sed con il comando a seguito dal testo che vuoi aggiungere:

sed-ne'$a hello'-e'p' hello.txt

Un terminale che mostra il processo di aggiunta di una singola riga di testo alla fine di un flusso di sed.

Nota: il flag -e dice a sed che la stringa racchiusa dopo di esso è un’espressione sed. Questo ti consente di concatenare più espressioni insieme senza invocare sed più volte.

È anche possibile includere interi file in un flusso di testo sed. Per farlo, usa il comando r seguito dal nome del file che vuoi aggiungere:

sed-ne'$r welcome.txt'-e'p' hello.txt

Un terminale che mostra il processo di aggiunta di un intero file alla fine di un flusso di sed.

4. Trovare e Sostituire Testo in Sed

Una delle caratteristiche più potenti di sed è la sua capacità di trovare e sostituire testo da un flusso di testo. A differenza dell’aggiunta e dell’eliminazione di testo, questo ti consente di modificare i dati in modo dinamico mentre passano attraverso le pipe UNIX, rendendolo molto più flessibile rispetto a un normale editor di testo.

Inizia stampando il tuo input testuale senza alcuna modifica da parte di sed:

sed-ne'p' hello.txt

Un terminale che stampa il contenuto del file

Sostituisci il comando p con s, quindi aggiungi tre barre rovesciate (/) dopo di esso:

sed-ne's///'-e'p' hello.txt

Inserisci una espressione regolare per il carattere stringa che vuoi abbinare tra le prime e le seconde barre rovesciate. Ad esempio, posso inserire il seguente valore per cercare parole che iniziano con “wo” nella mia stringa di input:

sed-ne's/wo*.//'-e'p' hello.txt

Posiziona il cursore di testo tra la seconda e la terza barra rovesciata, quindi fornisci il testo che vuoi sostituire ai tuoi abbinamenti. A differenza della colonna precedente, questa sezione non utilizza espressioni regolari strutturali:

sed-ne's/wo.*/website/'-e'p' hello.txt

Per impostazione predefinita, sed sostituisce solo la prima stringa che abbina su una particolare riga. Questo può essere un problema se vuoi sostituire ogni istanza di una parola nel tuo flusso di testo. Per risolvere questo, aggiungi l’opzione g dopo la terza barra rovesciata della tua espressione:

sed-ne's/wo.*/website/g'-e'p' hello.txt

Un terminale che mostra il comando di sostituzione in sed.

5. Copiare Dati Testuali nello Spazio di Memoria

Sed utilizza due buffer per memorizzare dati testuali: lo spazio di modello e lo spazio di memoria. Il primo funge da luogo temporaneo per il tuo testo mentre attraversa le espressioni sed. Nel frattempo, il secondo funge da clipboard dove puoi memorizzare dati testuali arbitrari.

Un vantaggio di questo approccio è che ti consente di “trattenere” determinati output senza fare affidamento su programmi esterni. Questo può essere utile se prevedi di utilizzare sed per elaborare manipolazioni testuali a più passaggi.

Per iniziare a utilizzare gli spazi di memoria, assicurati innanzitutto di avere un file con almeno alcune righe di testo al suo interno:

sed-ne'p' hello.txt

Sostituisci il comando secondario p con h, quindi fornisci un numero di riga o un valore regex che sed abbinerà nel tuo file. Fare questo dirà a sed di prendere quella specifica riga di testo e copiarla nel suo spazio di memoria:

sed-ne'3h' hello.txt

Nota: i dati all’interno di uno spazio di memoria non persistono attraverso diversi comandi sed.

Puoi anche usare il comando H per memorizzare più righe di testo all’interno del tuo spazio di memoria. Ad esempio, il seguente comando memorizza la terza e la quarta riga del mio file di testo e le stampa di nuovo nel terminale:

sed-ne'3,4H; $ {x; p}' hello.txt

Un terminale che mostra il processo di memorizzazione di più righe di testo nello

6. Usare Etichette per Creare Cicli in Sed

Anche se sed non è un linguaggio di programmazione completo, è comunque possibile creare cicli all’interno del programma. Questo è utile se hai un’espressione sed che deve continuamente esaminare un particolare pezzo di input testuale.

Per creare un ciclo in sed, devi prima creare un’etichetta per la tua espressione sed. A tal fine, devi usare il comando : seguito dall’etichetta che vuoi utilizzare per la tua espressione.

sed-e':x' hello.txt

Fornisci i criteri di corrispondenza per la tua espressione sed. Nel mio caso, voglio che vada alla fine di ogni riga nel mio testo di input:

sed-e':x; $' hello.txt

Digita i comandi secondari di sed che vuoi eseguire ogni volta che sed trova una corrispondenza, quindi racchiudili tra parentesi graffe. Quello seguente unisce due righe adiacenti, sostituisce il carattere di nuova linea con uno spazio e poi torna all’inizio dell’espressione:

sed-e':x; /$/ {N; s/\n/ /g; bx}' hello.txt

Un terminale che mostra il processo di rimozione dei caratteri di nuova linea utilizzando etichette sed nei cicli.

Puoi anche estendere questo per abbinare quasi qualsiasi tipo di input testuale. Ad esempio, il seguente comando utilizza la funzionalità regex estesa di sed per rimuovere i tag HTML dal tuo input testuale:

sed-re':x; s/<[^>]*>//g; {N; bx}' hello.html

Un terminale che mostra sed mentre rimuove i tag HTML in un file utilizzando cicli.

7. Apportare Modifiche Permanenti in Sed

Proprio come con qualsiasi altro strumento UNIX, sed può approfittare della reindirizzamento dell’output e delle pipe. Non solo questo ti consente di unire sed con altri programmi, ma ti offre anche l’opportunità di rendere le tue modifiche permanenti.

La seguente riga di codice crea un nuovo file “welcome.txt” dall’output del mio comando sed:

sed-ne'2p; 6p' hello.txt > hi.txt

Un terminale che mostra la capacità di sed di usare il reindirizzamento dell'output per salvare il suo output in file.

Oltre al reindirizzamento dell’output, puoi anche usare il flag incorporato -i per modificare il tuo file attuale invece di uscire con le tue modifiche nella console del terminale. Ad esempio, il seguente comando rimuove qualsiasi carattere di nuova linea dal mio file di testo e lo salva:

sed-ie':x; $; {N; s/\n/ /g; bx}' hello.txt

Un terminale che mostra il flag -i in sed, che consente al programma di

Se tutto questo discorso ti ha reso curioso riguardo alla riga di comando di Linux. Puoi leggere il nostro articolo precedente in cui parliamo di alcuni dei prompt Bash più interessanti che puoi utilizzare oggi.