2009-12-13 12 views
31

Come trovo e sostituisco una stringa sulla riga di comando in più file su unix?Trova e sostituisci più file sulla riga di comando

+0

possibile duplicato di [Trovare e sostituire un termine particolare in più file] (http://stackoverflow.com/questions/2263925/find-and-replace-a-particular-term-in-multiple-files) – Quanlong

risposta

41

ci sono molti modi .Ma una delle risposte potrebbe essere:

find . -name '*.html' |xargs perl -pi -e 's/find/replace/g' 
6

ho sempre fatto con script ndr o ex script.

for i in "[email protected]"; do ex - "$i" << 'eof'; done 
%s/old/new/ 
x 
eof 

Il ex comando è solo il: modalità di linea dal VI.

+0

Questo ha il netto vantaggio di poter eseguire modifiche più sofisticate. – alastair

2

con la recente shell bash, e supponendo che non c'è bisogno di attraversare le directory

for file in *.txt 
do 
while read -r line 
do 
    echo ${line//find/replace} > temp   
done <"file" 
mv temp "$file" 
done 
21

Come la soluzione di Zombie (e più veloce suppongo) ma con sed (di serie su molte distribuzioni e OSX) al posto di Perl:

find . -name '*.py' | xargs sed -i .bak 's/foo/bar/g' 

Questo sostituirà tutti foo occorrenze nei file Python sotto la directory corrente con bar e creare un backup per ogni file con l'estensione .py.bak.

e di togliere de .bak file:

find . -name "*.bak" -delete 
+0

Questo influenza gli spazi al di fuori della ricerca. Sembrava aggiungere nuove righe alla fine di ciascuno dei miei file. – Shane

+0

La modifica diretta di AFAIK non è supportata in tutte le versioni di sed; Penso che sia un'estensione GNU. – alastair

+0

è un'estensione GNU e almeno nella mia versione deve essere 'sed -i.bak' (senza spazio) – friedemann

4

usando find e sed con il nome o le directory con l'utilizzo di spazio questo:

find . -name '*.py' -print0 | xargs -0 sed -i 's/foo/bar/g' 
Problemi correlati