Come Usare Sed in Linux

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
- Selezionare e Ritoccare Flussi di Testo
- Rimuovere Testo da un Flusso di Sed
- Aggiungere Nuovo Testo ai Flussi di Sed
- Trovare e Sostituire Testo in Sed
- Copiare Dati Testuali nello Spazio di Memoria
- Usare Etichette per Creare Cicli in Sed
- 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.txtNota: 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’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
Per disabilitare questo comportamento bizzarro, aggiungi il flag -n prima di eseguire i tuoi comandi secondari di sed:
sed-n p hello.txt
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
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.txt2. 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
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.txtOltre 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.txtPuoi 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
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
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
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
Sostituisci il comando p con s, quindi aggiungi tre barre rovesciate (/) dopo di esso:
sed-ne's///'-e'p' hello.txtInserisci 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.txtPosiziona 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.txtPer 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
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.txtSostituisci 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.txtNota: 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
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.txtFornisci 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.txtDigita 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
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
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
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
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.