Come trovo e sostituisco una stringa sulla riga di comando in più file su unix?Trova e sostituisci più file sulla riga di comando
risposta
ci sono molti modi .Ma una delle risposte potrebbe essere:
find . -name '*.html' |xargs perl -pi -e 's/find/replace/g'
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.
Questo ha il netto vantaggio di poter eseguire modifiche più sofisticate. – alastair
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
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
Questo influenza gli spazi al di fuori della ricerca. Sembrava aggiungere nuove righe alla fine di ciascuno dei miei file. – Shane
La modifica diretta di AFAIK non è supportata in tutte le versioni di sed; Penso che sia un'estensione GNU. – alastair
è un'estensione GNU e almeno nella mia versione deve essere 'sed -i.bak' (senza spazio) – friedemann
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'
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