Il comando Sed o Stream Editor è un’utilità molto potente offerta dai sistemi Linux/Unix. Viene utilizzato principalmente per la sostituzione del testo, per trovare & sostituire, ma può anche eseguire altre manipolazioni del testo come inserimento, cancellazione, ricerca ecc. Con SED, possiamo modificare file completi senza doverli aprire. Sed supporta anche l’uso di espressioni regolari, il che rende sed uno strumento di manipolazione del testo ancora più potente.

In questo articolo, impareremo ad usare il comando SED con l’aiuto di alcuni esempi. La sintassi di base per usare il comando sed è,

sed OPTIONS…

Sed-Command-Options

Ora vediamo alcuni esempi.

Esempio :1) Visualizzazione del testo parziale di un file

Con sed, possiamo visualizzare solo alcune parti di un file piuttosto che vedere l’intero file. Per vedere alcune linee del file, usare il seguente comando,

$ sed -n 22,29p testfile.txt

qui, l’opzione ‘n’ sopprime la stampa dell’intero file & l’opzione ‘p’ stamperà solo le linee da 22 a 29.

Esempio :2) Visualizzare tutto tranne alcune linee

Per visualizzare tutto il contenuto di un file tranne alcune porzioni, usare il seguente comando,

$ sed 22,29d testfile.txt

L’opzione ‘d’ rimuoverà le linee menzionate dall’output.

Esempio :3) Visualizzare ogni 3a linea a partire dalla Nesima linea

Per visualizzare il contenuto di ogni 3a linea a partire dalla linea numero 2 o qualsiasi altra linea, utilizzare il seguente comando

$ sed -n '2~3p' file.txt

Esempio :4 ) Cancellare una linea usando il comando sed

Per cancellare una linea con sed da un file, usa il seguente comando,

$ sed Nd testfile.txt

dove ‘N’ è il numero della linea & l’opzione ‘d’ cancellerà il numero di linea menzionato. Per cancellare l’ultima linea del file, usa

$ sed $d testfile.txt

Esempio :5) Cancellare un intervallo di linee

Per cancellare un intervallo di linee dal file, esegui

$ sed '29,34d' testfile.txt

Questo cancellerà le linee da 29 a 34 dal file testfile.txt.

Esempio :6) Eliminazione di linee diverse da quelle menzionate

Per eliminare linee diverse da quelle menzionate da un file, useremo ‘!’

$ sed '29,34!d' testfile.txt

qui l’opzione ‘!’ è usata come no, quindi invertirà la condizione, cioè non eliminerà le linee menzionate. Tutte le altre righe 29-34 saranno cancellate dal file testfile.txt.

Esempio :7) Aggiungere righe/spazi vuoti

Per aggiungere una riga vuota dopo ogni riga non vuota, useremo l’opzione ‘G’,

$ sed G testfile.txt

Esempio :8) Cercare e sostituire una stringa usando sed

Per cercare & sostituire una stringa dal file, useremo il seguente esempio,

$ sed 's/danger/safety/' testfile.txt

qui l’opzione ‘s’ cercherà la parola ‘pericolo’ & sostituendola con ‘sicurezza’ su ogni linea solo alla prima occorrenza.

Esempio :9) Cercare e sostituire una stringa dall’intero file usando sed

Per sostituire completamente la parola dal file, useremo l’opzione ‘g’ con ‘s’,

$ sed 's/danger/safety/g' testfile.txt

Esempio :10) Sostituire l’ennesima occorrenza del modello di stringa

Possiamo anche sostituire una stringa all’ennesima occorrenza di un file. Come sostituire ‘danger’ con ‘safety’ solo alla seconda occorrenza,

$ sed ‘s/danger/safety/2’ testfile.txt

Per sostituire ‘danger’ alla seconda occorrenza di ogni linea di tutto il file, usate

$ sed 's/danger/safety/2g' testfile.txt

Esempio :11) Sostituire una stringa su una linea particolare

Per sostituire una stringa solo da una linea particolare, usa

$ sed '4 s/danger/safety/' testfile.txt

Questo sostituirà solo la stringa dalla 4° linea del file. Possiamo anche menzionare un intervallo di linee invece di una singola linea,

$ sed '4,9 s/danger/safety/' testfile.txt

Esempio :12) Aggiungere una linea dopo/prima della ricerca abbinata

Per aggiungere una nuova linea con un certo contenuto dopo ogni pattern match, usare l’opzione ‘a’ ,

$ sed '/danger/a "This is new line with text after match"' testfile.txt

Per aggiungere una nuova linea con un certo contenuto a prima di ogni pattern match, usare l’opzione ‘i’,

$ sed '/danger/i "This is new line with text before match" ' testfile.txt

Esempio :13) Cambiare un’intera linea con un pattern corrispondente

Per cambiare un’intera linea in una nuova linea quando un pattern di ricerca corrisponde abbiamo bisogno di usare l’opzione ‘c’ con sed,

$ sed '/danger/c "This will be the new line" ' testfile.txt

Così quando il pattern corrisponde a ‘pericolo’, l’intera linea sarà cambiata nella linea indicata.

Opzioni avanzate con sed

Fino ad ora abbiamo usato solo espressioni semplici con sed, ora discuteremo alcuni usi avanzati di sed con regex,

Esempio :14) Eseguire più comandi sed

Se abbiamo bisogno di eseguire più espressioni sed, possiamo usare l’opzione ‘e’ per concatenare i comandi sed,

$ sed -e 's/danger/safety/g' -e 's/hate/love/' testfile.txt

Esempio :15) Fare una copia di backup prima di modificare un file

Per creare una copia di backup di un file prima di modificarlo, usate l’opzione ‘-i.bak’,

$ sed -i.bak -e 's/danger/safety/g' testfile.txt

Questo creerà una copia di backup del file con estensione .bak. Puoi anche usare altre estensioni se vuoi.

Esempio :16) Cancellare una linea di file che inizia con & che termina con un modello

Per cancellare una linea che inizia con una particolare stringa & che termina con un’altra stringa, usa

$ sed -e 's/^danger.*stops$//g' testfile.txt

Questo cancellerà la linea con ‘pericolo’ all’inizio & ‘stop’ alla fine & può avere qualsiasi numero di parole in mezzo, ‘.*’ definisce quella parte.

Esempio :17) Aggiungere linee

Per aggiungere del contenuto prima di ogni linea con sed & regex, usare

$ sed -e 's/.*/testing sed &/' testfile.txt

Così ora ogni linea avrà ‘testing sed’ prima di essa.

Esempio :18) Rimuovere tutte le linee commentate & linee vuote

Per rimuovere tutte le linee commentate cioè linee con # & tutte le linee vuote, usare

$ sed -e 's/#.*//;/^$/d' testfile.txt

Per rimuovere solo le linee commentate, usare

$ sed -e 's/#.*//' testfile.txt

Esempio:19) Ottenere la lista di tutti i nomi utente da /etc/passwd

Per ottenere la lista di tutti i nomi utente dal file /etc/passwd, usare

$ sed 's/\(*\).*/\1/' /etc/passwd

una lista completa di tutti i nomi utente sarà generata sullo schermo come output.

Esempio :20) Prevenire la sovrascrittura dei link di sistema con il comando sed

Il comando ‘sed -i’ è noto per rimuovere i link di sistema & creando solo file regolari al posto del file di collegamento. Quindi, per evitare una tale situazione & evitare che ‘sed -i’ distrugga i collegamenti, utilizzare le opzioni ‘-follow-symklinks’ con il comando in esecuzione.

Immaginiamo di voler disabilitare SELinux su CentOS o RHEL Severs

# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

Lascia un commento

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