Come usare Sed in Linux

Come usare Sed in Linux
Una fotografia di due monitor di computer 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 nel suo output. Qui, diamo un’occhiata a una breve panoramica della filosofia UNIX, esaminiamo le basi dell’utilizzo di sede 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 nsottocomando. 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 terminale che mostra il contenuto del

Un’altra delle funzioni di base di sed è il psottocomando. 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 psottocomando 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 psia presente o meno:

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

Per disattivare questo comportamento anomalo, aggiungi il -nflag prima di eseguire i sottocomandi sed:

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

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 psottocomando.

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

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

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

Un terminale che mostra sed mentre stampa righe non adiacenti da un file di testo.

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 dsottocomando insieme alla riga o all’intervallo specifico che si desidera eliminare:

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

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

Un terminale che mostra il processo di eliminazione di un intervallo di righe utilizzando sed.

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:

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

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 acomando seguito dal testo che desideri aggiungere:

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

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

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

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:

Un terminale che stampa il contenuto del

Sostituisci il psottocomando 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’ gopzione dopo la terza barra rovesciata della tua espressione:

Un terminale che mostra il sottocomando di sostituzione in sed.

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 psottocomando 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 Hsottocomando 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:

Un terminale che mostra il processo di mantenimento di più righe di testo in sed

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:

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

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:

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

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:

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

Oltre al reindirizzamento dell’output, puoi anche usare il flag incorporato -iper 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:

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

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

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *