Newsgroup: it.comp.os.linux.sys
Titolo: sostituire stringa in molti file?

Ciao a tutti,
come avrete già capito dall'oggetto devo sostituire una stringa all'interno 
di molti file di testo (più di 1000), vorrei sapere se qualcuno di voi 
conosce un modo per farlo...
Grazie mille!
bye

Andrea ha scritto:

Uh... è una domanda trabocchetto? :-)
sed s/vecchio/nuovo/ fileorig.txt > filedest.txt
-- 
Renato
--------------------------------
Usi Fedora? Fai un salto da noi:
http://www.fedoraitalia.org

 sed s/vecchio/nuovo/ fileorig.txt > filedest.txt
io direi piuttosto:
cd /directory/vecchi/files
IFS="
"
for i in `ls`; do
	cat sed 's/prima/dopo/g' > "/directory/DIVERSA/$i"
end
Se usi la stessa directory come origine e destinazione perderai TUTTI i 
files. Impostare IFS server *solo* se alcuni dei file hanno degli spazi 
nel nome.
-- 
Lorenzo `paulatz' Paulatto
Trieste
``Se Gauss fosse vivo oggi, sarebbe un hacker.''
      --Peter Sarnack (Princeton University)

 end
ommioddiocheorrore!
sed -i s/vecchio/nuovo/g *
e buonanotte al secchio.
.a.
-- 
Il mattino ha l'oro in bocca. Il MATTino ha l'OrO In bOcca.
i lma tt ino ha l'o roin bocc a.ilmattinohal'oroinbocca. il ma tt in
oh al' or oi nb oc ca. il matti noha l'oroinbocca. IL MATtiNO Ha l'ORO
InBOCCa. I l m a t t i n o  h a l' o r o i n b o c c a . ilmattinohal'oroin
BoCcA. iLmAtTiNoHaL'oRoInBoCcA.

 
Eh, vabbeh, ma trovare i file e applicargli sed era la parte lasciata 
all'esercizio del lettore! :-)
Potrebbe farlo anche con un find, o con xargs, ad esempio.
for nomefile in `find . PARAMETRI DI RICERCA`; do
   sed s/VECCHIASTRINGA/NUOVATRINGA/ $nomefile > /nuovo/path/$nomefile
done
così i file possono pure essere in una gerarchia di directories.
...e ovviamente si può complicare a piacere :-D


 
sostituisce una stinga in tutti i file e tutte le sottodir
find . -type f|xargs perl -pi -e "s/trova/sostituisci/g;"
ciao
cits

 bye
-- 
Imagine if every Thursday your shoes exploded if you tied them the usual
way.
This happens to us all the time with computers, and nobody thinks of
complaining.

mi accodo al discorso:
Posso usare un comando dentro sed? tipo:
sed -i s/`cat file1.txt`// file2.txt > file3.txt
(correggetemi la sintassi)
Ho un file file1.txt che contiene 100 righe
Ho un file file2.txt che ne contiene 80
Per trovare le 80 in comune uso:
for Y in `cat file1.txt`; do grep -wi $Y file2.txt >> file3.txt ; done
Ma per trovare le righe che sono in file1.txt e mancano in file2.txt?
Come trovo ste 20 righe mancanti?

 Come trovo ste 20 righe mancanti?
molto banalmente:
diff file1.txt file2.txt
:-)
-- 
Massimo Bacilieri AKA Crononauta 
ICQ:4005815


Per brevita`: file1.txt = b e file2.txt = a
$ cat a
pippo
pluto
paperino
$ cat b
pluto
minni
clarabella
paperino
$ cp b c; cat a|while read l; do grep -v "$l" c > d; mv -f d c; done
$ cat c
minni
clarabella
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 diff file1.txt file2.txt
Cosi` ti trova anche le linee di file2 che non sono in file1...
Bisogna fare un grep e un sed sull'output per selezionare solo le
linee di file1 e per levare il prefisso


avanzi una birra... funziona!!!

 Cosi` ti trova anche le linee di file2 che non sono in file1...
Beh da come aveva presentato il problema non era il caso: aveva detto
che 80 righe sono in comune, e file2 è appunto 80 righe. In sostanza
file2 è completamente contenuto dentro file1 che ha 20 righe in più, e
si chiedeva come identificarle.
Ad ogni modo, diff file1 file2 ti presenta in output le righe con
prefisso: "<" per quelle che sono in file2 ma non in file1, e ">" per
quelle che sono in file1 ma non in file2.
Se volevi quelle presenti in file1 "rimosse" da file2, ti basta un
semplice grep:
diff file1 file2 | grep "<"


Funziona anche questo... una birra anche a te ^_________^

 Funziona anche questo... una birra anche a te ^_________^
In realta funziona solo se i due file sono derivati da un file comune ma se
sono creati con le righe in modo random diff non funziona.
Perciò:
sort file1.txt -o file3.txt
sort file2.txt -o file4.txt
comm -23 file3.txt file4.txt
-- 
Nat

Andrea wrote:

for F in *; do printf "g/PRIMA/s//DOPO/g\nwq\n" | ex $F; done
-- 
Nat