Intendi cercare e sostituire una stringa in tutti i file corrispondenti a grep?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
Modifica
Dal momento che questa sembra essere una domanda abbastanza popolare, ho pensato di aggiornarla.
Al giorno d'oggi uso principalmente ack-grep
in quanto è più user-friendly. Quindi il comando precedente sarebbe:
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
Per gestire gli spazi bianchi nei nomi dei file puoi eseguire:
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
puoi fare di più con ack-grep
. Supponi di voler restringere la ricerca solo ai file HTML:
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
E se lo spazio bianco non è un problema, è ancora più breve:
perl -p -i -e 's/old/new/g' `ack -l --html searchpattern`
perl -p -i -e 's/old/new/g' `ack -f --html` # will match all html files
Questo sembra essere quello che vuoi, in base all'esempio che hai dato:
sed -i 's/foo/bar/g' *
Non è ricorsivo (non scenderà nelle sottodirectory). Per una buona soluzione sostituendo i file selezionati in un albero userei find:
find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
Il *.html
è l'espressione che i file devono corrispondere, il .bak
dopo il -i
fa una copia del file originale, con un'estensione .bak (può essere qualsiasi estensione che ti piace) e il g
alla fine dell'espressione sed dice a sed di sostituire più copie su una riga (piuttosto che solo la prima). Il -print
da trovare è una comodità per mostrare quali file sono stati abbinati. Tutto ciò dipende dalle versioni esatte di questi strumenti sul tuo sistema.