sostituire una parola in un milione di file

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

Moderatore: matteo

sostituire una parola in un milione di file

Messaggioda Michele » mar lug 15, 2008 1:22 pm

Non so se vi è mai capitato di dover cambiare una parola che abbiamo inserito in diversi file!
Oggi matt mi ha dato la soluzione:
Codice: Seleziona tutto
sudo find -type f -print -exec sed -i.bck -e 's/vecchia parola/nuova parola/g' {} \;

Questo codice crea nella directory un file con estensione .bck per ogni file presente nella directory.
Tale file sarà una copia dell'originale.
Dopo aver controllato che tutto è a posto per eliminare tali file potete eseguire:
Codice: Seleziona tutto
sudo find -name \*.bck -exec rm {} \;

Che cancella tutti i bck!
Io l'ho trovato estremamente utile! :P
Michele
 
Messaggi: 308
Iscritto il: ven mar 17, 2006 2:14 am

Messaggioda matteo » mer lug 16, 2008 11:20 am

chiaramente la find è necessaria solamente se si usano sottodirectory e sudo serve solo se tali modifiche vanno fatte su file di cui non si hanno i permessi, come quelli di root.

approfondimenti:
1) uso di sed con standard input:
per visualizzare un intero file con una parola modificata:
Codice: Seleziona tutto
cat nomefile|sed -e 's/vecchia/nuova/g'

potrebbe essere utile aggiungere un |more |less o >newfile alla fine della riga.

visualizzare solo determinate righe ed effettuare sostituzioni su queste
Codice: Seleziona tutto
grep pippo nomefile|sed -e 's/vecchia/nuova/g'


2) uso dei caratteri jolly (per la precisione 'espressioni regolari')
cerca per l'occorrenza della parola 'vecchia', la sostituisce con nuova e cancella il resto della riga:
Codice: Seleziona tutto
cat nomefile|sed -e 's/vecchia.*$/nuova/'


idem ma cancella l'inizio della riga:
Codice: Seleziona tutto
cat nomefile|sed -e 's/^.*vecchia/nuova/'


cerca per 'vecchia' o 'vecchie':
Codice: Seleziona tutto
cat nomefile|sed -e 's/vecchi[ae]/nuova/g'


cerca una riga che contenga solo numeri:
Codice: Seleziona tutto
cat nomefile|sed -e 's/^[0-9]*$/nuova/'


cerca pluto e pippo con qualsiasi cosa in mezzo:
Codice: Seleziona tutto
cat nomefile|sed -e 's/pluto.*pippo/nuova/g'


3) uso diverso dalle sostituzioni
elimina righe vuote dentro un file (questa riga _non_ fa il backup del file):
Codice: Seleziona tutto
sed -i -e '/^$/d' nomefile




chi padroneggia sed padroneggia il sistema.

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

Re: sostituire una parola in un milione di file

Messaggioda francesco » mer set 26, 2012 11:31 am

Padroneggiare per crescere:

Ho modificato 96000 pagine html di un sito staticizzato con httrack utilizzando sed, per modificare alcuni percorsi e i nomi di alcuni file, una delle operazioni che ho fatto è stata la ricerca in tutti i file html e la sostituzione di stringa con sed. Un comando come questo:

Codice: Seleziona tutto
# find . -name \*\.html -exec sed -i 's/src=\"DocEditor\/test\/Image\/nazionalit\%e0\.jpg\"/src=\"DocEditor\/test\/Image\/nazionalita\.jpg\" {} \;


Ora, quello che vorrei fare è "tagliare" l'intero footer di una serie di pagine, e sostituirlo con un altro, ho provato a elimimare il contenuto tra due tag con un comando simile a questo:
Codice: Seleziona tutto
sed '/<body>/,/<\/body>/d' index.html > index2.html


il che funziona,

adesso vorrei capire sei è invece possibile sostituire un intero blocco di codice con un altro nuovo, premesso che sia il vecchio che il nuovo blocco sono delimitati da apertura e chiusura di un tag commento fatto così:

Codice: Seleziona tutto
<!--tabella footer (inizio file footer.htm) --> Altro codice....  <!-- (fine file footer.htm) -->


Mi sto documentando ma ancora non ne sono venuto a capo, avete suggerimenti? Un saluto,
France
francesco
 
Messaggi: 25
Iscritto il: dom mar 19, 2006 11:59 pm


Torna a Unix, Linux & reti

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron