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…
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