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 nel suo output. Qui, diamo un’occhiata a una breve panoramica della filosofia UNIX, esaminiamo le basi dell’utilizzo di sed
e mostriamo esempi di come utilizzare il programma per le attività quotidiane.
Le basi dell’utilizzo di Sed
Sed è un programma che può leggere e modificare flussi di dati di testo. Ciò significa che, a differenza di un normale editor di testo, sed non modifica 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 con sed, crea prima un file con almeno cinque righe di testo al suo interno. Assicurati che ci sia un carattere “new line” tra le tue righe:
Il comando generale per sed è qualcosa del tipo:
Una delle funzioni più basilari in sed è il n
sottocomando. Funziona leggendo i dati dall’input di sed e inserendoli nello “spazio pattern” del tuo programma. Si tratta di un buffer speciale che contiene qualsiasi testo in arrivo prima che sed vi esegua qualsiasi manipolazione:
Un’altra delle funzioni di base di sed è il p
sottocomando. Simile a n
, legge i dati in arrivo dall’input di sed e li inserisce nello spazio dei pattern del programma. Tuttavia, li stampa anche esplicitamente sull’output del tuo terminale.
L’uso del p
sottocomando può essere fonte di confusione per i principianti, poiché eseguirlo con qualsiasi input di testo fa sì che sed stampi il suo output due volte. Questo perché, per impostazione predefinita, sed stampa automaticamente il suo pattern space indipendentemente dal fatto che p
sia presente o meno:
Per disattivare questo comportamento anomalo, aggiungi il -n
flag prima di eseguire i sottocomandi sed:
Dopo aver chiarito le basi, le sezioni seguenti esamineranno i diversi modi in cui è possibile utilizzare sed per manipolare dati di testo.
1. Selezione e ritaglio dei flussi di testo
Oltre alla stampa, puoi anche usare sed per selezionare e tagliare il testo sia da flussi di dati che da file. Il modo più semplice per farlo è aggiungere un valore di intervallo al p
sottocomando.
Il seguente comando utilizza la sintassi range di sed per stampare dalla terza alla quinta riga nel file “hello.txt”:
Puoi anche usare il p
sottocomando per stampare righe non adiacenti nel tuo testo. Ad esempio, il seguente comando stampa la prima e la quarta riga nel file “hello.txt”:
2. Rimozione del testo da un flusso Sed
Sed può anche eliminare dati da qualsiasi flusso di testo in arrivo. Ciò è utile se vuoi rimuovere alcune righe di testo da un file di grandi dimensioni o ripulire l’output di un programma per mostrare solo le informazioni di cui hai bisogno.
Per fare ciò, utilizzare il d
sottocomando insieme alla riga o all’intervallo specifico che si desidera eliminare:
Simile alla stampa di righe di testo, il d
sottocomando funziona con intervalli multi-riga. Ad esempio, il seguente comando eliminerà le prime quattro righe dal file “hello.txt”:
Oltre a far corrispondere intervalli di righe specifici, puoi usare espressioni regolari per trovare il testo che vuoi eliminare. In questo modo dirai a sed di cercare tutte le righe che contengono la parola “world” e di eliminarla:
Puoi anche trattare le espressioni regolari come un intervallo per il tuo file di input. Questo ti dà più flessibilità nel definire le tue selezioni all’interno del programma:
3. Aggiungere nuovo testo a un flusso Sed
Oltre a cancellare il testo, sed è anche in grado di aggiungere nuovo testo ai flussi di dati esistenti. Sebbene non sia al livello di un editor di testo completo, questa funzionalità può comunque essere utile per modifiche una tantum e aggiunte di testo di base.
Per aggiungere una nuova riga di testo, esegui sed con il a
comando seguito dal testo che desideri aggiungere:
È anche possibile includere interi file in un flusso di testo sed. Per farlo, usa il r
comando seguito dal nome del file che vuoi aggiungere:
4. Trovare e sostituire il testo in Sed
Una delle funzionalità 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 consente di modificare dinamicamente i dati mentre passano attraverso le pipe UNIX, rendendolo molto più flessibile rispetto a un normale editor di testo.
Inizia stampando di prova il testo immesso senza alcuna modifica da sed:
Sostituisci il p
sottocomando con s
, quindi aggiungi tre barre rovesciate (/) dopo di esso:
Inserisci un’espressione regolare strutturale della stringa di caratteri che vuoi abbinare tra la prima e la seconda barra rovesciata. Ad esempio, posso inserire il seguente valore per cercare parole che iniziano con “wo” nella mia stringa di input:
Posiziona il cursore del testo tra la seconda e la terza barra rovesciata, quindi fornisci il testo con cui vuoi sostituire le tue corrispondenze. Contrariamente alla colonna precedente, questa sezione non utilizza espressioni regolari strutturali:
Di default, sed sostituisce solo la prima stringa che corrisponde su una riga specifica. Questo può essere un problema se vuoi sostituire ogni istanza di una parola nel tuo flusso di testo. Per risolvere questo problema, aggiungi l’ g
opzione dopo la terza barra rovesciata della tua espressione:
5. Copia dei dati di testo nello spazio di attesa
Sed usa due buffer per memorizzare i dati di testo: lo spazio pattern e lo spazio hold. Il primo funge da luogo temporaneo per il testo mentre passa attraverso le espressioni sed. Nel frattempo, il secondo funge da clipboard in cui è possibile memorizzare dati di testo arbitrari.
Un vantaggio di questo approccio è che ti consente di “mantenere” determinati output senza affidarti a programmi esterni. Questo può essere utile se stai pianificando di usare sed per elaborare manipolazioni di testo multi-step.
Per iniziare a utilizzare gli spazi di attesa, assicurati innanzitutto di avere un file con almeno alcune righe di testo al suo interno:
Sostituisci il p
sottocomando con h
, quindi fornisci un numero di riga o un valore regex che sed troverà nel tuo file. In questo modo indicherai a sed di prendere quella specifica riga di testo e di copiarla nel suo spazio di attesa:
Puoi anche usare il H
sottocomando per memorizzare più righe di testo all’interno del tuo spazio di attesa. Ad esempio, il seguente comando memorizza la terza e la quarta riga del mio file di testo e le stampa sul terminale:
6. Utilizzo di etichette per creare cicli in Sed
Sebbene sed non sia un linguaggio di programmazione completo, è comunque possibile creare loop all’interno del programma. Ciò è utile se hai bisogno di un’espressione sed che deve passare continuamente su un particolare pezzo di input di testo.
Per creare un loop in sed, devi prima creare un’etichetta per la tua espressione sed. Per questo, devi usare il :
sottocomando seguito dall’etichetta che vuoi usare per la tua espressione.
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:
Digita i sottocomandi sed che vuoi eseguire ogni volta che sed trova una corrispondenza, quindi racchiudila tra parentesi graffe. Il seguente unisce due righe adiacenti, sostituisce il carattere di nuova riga con uno spazio, quindi torna all’inizio dell’espressione:
Puoi anche estenderlo per far corrispondere quasi ogni tipo di testo di input. Ad esempio, il seguente comando usa la funzionalità regex estesa di sed per rimuovere i tag HTML dal tuo testo di input:
7. Apportare modifiche permanenti in Sed
Proprio come qualsiasi altro strumento UNIX, sed può trarre vantaggio dal reindirizzamento dell’output e dalle pipe. Questo non solo ti consente di incollare sed con altri programmi, ma ti dà anche l’opportunità di rendere permanenti le tue modifiche.
La seguente riga di codice crea un nuovo file “welcome.txt” dall’output del mio comando sed:
Oltre al reindirizzamento dell’output, puoi anche usare il flag incorporato -i
per modificare il tuo file corrente invece di inviare le modifiche nella console del terminale. Ad esempio, il seguente comando rimuove tutti i caratteri di nuova riga dal mio file di testo e lo salva:
Se tutto questo discorso vi ha incuriosito con la riga di comando di Linux. Potete leggere il nostro articolo precedente in cui parliamo di alcuni dei prompt Bash più interessanti che potete usare oggi.
Credito immagine: Morgan Richardson tramite Unsplash . Tutte le modifiche e gli screenshot sono di Ramces Red.
Lascia un commento