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”]
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.
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.
Come cancellare la prima parte delle righe fino al primo spazio?
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