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

alex@goku:~$ sed -e '1,10s/pippo/pluto/g' <file>
alex@goku:~$ echo "/data/pippo/paperino" | sed 's/\/pippo/\/pluto/g'
/data/pluto/paperino
alex@goku:~$ 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>
alex@goku:~$ sed -n '150p' <file>
# visualizzo un intervallo di righe di <file>
alex@goku:~$ 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 <file>
alex@goku:~$ sed '1,2d' <file>
# seleziono la seconda riga di <file>
# in pratica faccio la negazione della cancellazione
alex@goku:~$ sed '2,2!d' <file>

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:

alex@goku:~$ sed -n '/bash/p' <file>

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:

alex@goku:~$ sed '148i\ciao' <file>

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

alex@goku:~$ cat prova.txt
pippo
pluto
alex@goku:~$ sed -i '/pippo/c\pluto' prova.txt
alex@goku:~$ cat prova.txt
pluto
pluto

[ad name=”HTML”]

4 Commenti on Usiamo il sed

  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.

    alex@goku:~$ nl test.txt
    1 uno
    2 due
    3 tre
    4 quattro
    5 cinque

    (oppure con il less) alex@goku:~$ 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).

    alex@goku:~$ cp test.txt test.bck
    alex@goku:~$ sed -i '4d' test.txt
    alex@goku:~$ sed '4i\four line' test.txt > test.new
    alex@goku:~$ mv test.new test.txt
    alex@goku:~$ cat test.txt
    uno
    due
    tre
    four line
    cinque

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

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

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.