Rimpiazzare testo in file con linux

Forum dedicato agli studenti del corso linux e a tutti gli amanti del pinguino!

Moderatore: matteo

Rimpiazzare testo in file con linux

Messaggioda andrea » gio giu 12, 2008 10:28 pm

Ciao a tutti!
come posso, in Linux, con un comando da shell, cercare un testo in un file e sostituirlo con un altro? Ad esempio sostituire nel file miofile.txt ogni occorrenza di CANE con GATTO.
andrea
 
Messaggi: 42
Iscritto il: mar ott 09, 2007 10:28 am

Messaggioda matteo » ven giu 13, 2008 10:17 am

la risposta è sed

in pipe (per mostrarlo a schermo o redirigerlo su un file)
cat miofile.txt |sed 's/CANE/GATTO/g'
questo lo mostra a schermo ma non modifica il file.

sed -i -e 's/CANE/GATTO/g' miofile.txt
modifica il file

sed -i.bak -e 's/CANE/GATTO/g' miofile.txt
modifica il file ma ne crea una copia di backup chiamata miofile.txt.bak

nella prima sintassi non è presente il -e perchè è sottointeso; dove vi sono più opzioni, invece, è obbligatorio p.e.:
cat miofile.txt|sed -e 's/CANE/GATTO/g' -e 's/PLUTO/PAPERINO/g'
sostituisce tutti i CANE in GATTO e i PLUTO in PAPERINO.

la 'g' significa 'qualsiasi occorrenza nella riga'
se non si specifica e nella riga ci sono più occorrenze, allora viene modificata solo la prima.

in molti casi, tipo quello in esame, è facoltativo utilizzare gli apici
cat miofile.txt|sed s/CANE/GATTO/g
oppure si possono utilizzare i doppi apici
cat miofile.txt|sed "s/CANE/GATTO/g"
se nella sostituzione ci sono spazi, allora gli apici (singoli o doppi) sono necessari
cat miofile.txt|sed "s/CANE/GATTO e TOPO/g"
per toglierla, una stringa, sostituirla con niente
cat miofile.txt|sed s/CANE//g
se si devono sostituire caratteri speciali, allora questi vanno 'quotati', per esempio per sostituire il .
cat miofile.txt|sed 's/x.y/ciao/g'
in questo caso '.' significa qualsiasi carattere. quindi x.y viene cambiato in ciao, ma viene cambiato anche xxy xay x1y ... per sostituire solo x.y
cat miofile.txt|sed 's/x\.y/ciao/g'
idem per sostituire la \
sed 's/C:\\WINDOWS\\System32\\//g' questo elimina tutti i C:\WINDOWS\System32\
così per sostituire la /
sed 's/\/home\/matteo\/pippo\.txt/\/tmp\/pluto.txt/g'
però è poco leggibile. in questo caso
sed 's|/home/matteo/pippo.txt|/tmp/pluto.txt/g'

quello che viene messo nella parte da sostituire (CANE) è una 'espressione regolare' e su queste ci sono trattati interi

l'* è un carattere speciale, quindi per sostituirlo come carattere va quotato
[a-z] intercetta qualsiasi carattere da a a z minuscoli
[a-zA-Z0-9] intercetta qualsiasi carattere alfanumerico
[^abc] intercetta qualsiasi carattere tranne a b c
* intercetta qualsiasi numero contiguo di quello che c'è scritto prima dell'*:
a* intercetta a aa aaa aaaa o la stringa vuota (per qualsiasi si intende anche 0 occorrenze)
\+ è come * ma almeno una occorrenza
[0-9]\+ intercetta qualsiasi tutti i numeri, e deve esistere
.* intercetta tutto
sed 's/CANE.*GATTO/CANE+GATTO/g' elimina tutto ciò che si trova tra CANE e GATTO con un +
^ indica che il testo deve essere all'inizio della riga
sed 's/^CANE/GATTO/' sostituisce CANE con GATTO a patto che CANE sia all'inizio della riga
$ indica che il testo deve essere alla fine della riga
sed 's/CANE$/GATTO/' sostituisce CANE con GATTO a patto che CANE sia alla fine della riga
^$ intercetta le righe vuote
sed 's/^$/questa riga era vuota/'

mischiandoli tutti si può fare praticamente tutto (quasi.. ci sono tanti altre possibilità).

Matteo
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am


Torna a Unix, Linux & reti

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron