Crea sito

Usiamo il sed

Vediamo alcuni modi di usare il sed. L’uso classico è di impiegarlo per fare la sostituzione di una stringa all’interno di un file; la sostituzione può interessare tutto il file oppure posso delimitare l’intervallo di righe in cui fare la sostituzione. Se voglio sostituire una stringa che contiene dei caratteri speciali, quest’ultimi vanno perceduti dal carattere di escape (ad esempio lo slash va preceduto dal backslash).

[email protected]:~$ sed -e '1,10s/pippo/pluto/g' 
[email protected]:~$ echo "/data/pippo/paperino" | sed 's/\/pippo/\/pluto/g'
/data/pluto/paperino
[email protected]:~$ echo "/data/pippo/paperino" | sed 's,pippo,pluto,g'
/data/pluto/paperino

Se voglio stampare o selezionare una determinata riga di un file uso il comando p (print).

# visualizzo la riga numero 150 di <file>
[email protected]:~$ sed -n '150p' <file>
# visualizzo un intervallo di righe di <file>
[email protected]:~$ sed -n '150,152p' <file>

Invece se voglio cancellare una determinata riga di un file o un blocco di righe uso il comando d (delete).

# cancello le prime 2 righe di 
[email protected]:~$ sed '1,2d' 
# seleziono la seconda riga di 
# in pratica faccio la negazione della cancellazione
[email protected]:~$ sed '2,2!d' 

Possiamo usare il sed anche per fare delle ricerche (tipo il comando grep). Ad esempio ricerchiamo una stringa di testo e visualizziamo tutte le righe che la contengono:

[email protected]:~$ sed -n '/bash/p' 

Tramite il comando i (insert) o il comando a (append) o il comando c (change) possiamo inserire, appendere o cambiare una stringa in un file:

[email protected]:~$ sed '148i\ciao' 

Con l’opzione -i (–in-place) il sed sovrascrive drettamente il file originale, quindi conviene avere una copia di sicurezza.

[email protected]:~$ cat prova.txt
pippo
pluto
[email protected]:~$ sed -i '/pippo/c\pluto' prova.txt
[email protected]:~$ cat prova.txt
pluto
pluto

4 comments

  1. Non conoscendo a fondo SED e la sua sintassi, questo articolo è molto confusionario.
    Nel primo esempio non di capisce nulla, ci sono 5 righe ma /s e /g non dici cosa siano.
    Nel secondo esempio dici di usare il comando print ( -p ) e poi usi -n .

    A me interessava capire come sostituire una riga con un’altra, so di poterlo fare con sed, ma dovrò cercare altrove per chiarire le mie idee.

  2. Colgo l’occasione per spiegarmi meglio e fare un po’ di chiarezza. Prima di tutto bisogna distinguere i comandi del sed dalle opzioni. I comandi linux in genere hanno svariate opzioni e sono sempre preceduti dal segno meno (ad esempio nel comando “ls -l” l’opzione -l indica di visualizzare i file nel formato a lista completa). Le opzioni del sed si possono vedere dal manuale con il classico comando “man sed“. Nel mio caso -n rappresenta un’opzione mentre p (print) è un comando del sed ed è indicato all’interno di singoli apici.

    Ora veniamo al tuo caso specifico; direi che la sostituzione di una riga può essere fatta con una delete (d) e una insert (i). Quindi con nl (number lines of files) individuiamo la riga da cancellare all’interno del tuo file di testo. Se il file è molto lungo suggerisco di usare less in modo da paginare l’output.

    [email protected]:~$ nl test.txt
    1 uno
    2 due
    3 tre
    4 quattro
    5 cinque

    (oppure con il less) [email protected]:~$ nl test.txt | less

    Ora invece eseguiamo i comandi di cancellazione della riga 4 e successivo inserimento (come sempre conviene fare una copia di sicurezza del file da modificare).

    [email protected]:~$ cp test.txt test.bck
    [email protected]:~$ sed -i '4d' test.txt
    [email protected]:~$ sed '4i\four line' test.txt > test.new
    [email protected]:~$ mv test.new test.txt
    [email protected]:~$ cat test.txt
    uno
    due
    tre
    four line
    cinque

    Spero di essere stato esaustivo ma sono sempre disponibile a ulteriori chiarimenti.

  3. Pinco Palla

    Come cancellare la prima parte delle righe fino al primo spazio?

  4. Ti faccio un esempio su un file di test; puoi fare tutte le prove che vuoi usando il comando cat file | sed 's//' . Una volta individuata la condizione che ti interessa puoi usare l’opzione -i del sed che modifica direttamente il file. Di seguito alcuni esempi:

    $ cat /tmp/test.txt
    abcde fgh ijklm
    123 456 7890
    qwerty uio p

    Test rimozione del primo spazio incontrato (anche all’inizio della riga)

    $ cat /tmp/test.txt | sed 's/^ *//'
    abcde fgh ijklm
    123 456 7890
    qwerty uio p

    Effettiva rimozione (da notare l’opzione -i del sed)

    $ sed -i 's/^ *//' /tmp/test.txt

    Altro caso (spazio in mezzo alla riga e non come primo carattere):

    $ cat /tmp/test2.txt
    abcd efgh ijk
    12345 789 1123

    $ cat /tmp/test2.txt | sed 's/ //'
    abcdefgh ijk
    12345789 1123

Leave a Reply

Il tuo indirizzo email non sarà pubblicato.

*