Voulez-vous dire rechercher et remplacer une chaîne dans tous les fichiers correspondant à grep ?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
Modifier
Comme cela semble être une question assez populaire, j'ai pensé que je mettrais à jour.
Aujourd'hui, j'utilise principalement ack-grep
car c'est plus convivial. Donc la commande ci-dessus serait :
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
Pour gérer les espaces dans les noms de fichiers, vous pouvez exécuter :
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
vous pouvez faire plus avec ack-grep
. Supposons que vous souhaitiez limiter la recherche aux fichiers HTML uniquement :
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
Et si l'espace blanc n'est pas un problème, c'est encore plus court :
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
Cela semble être ce que vous voulez, d'après l'exemple que vous avez donné :
sed -i 's/foo/bar/g' *
Il n'est pas récursif (il ne descendra pas dans les sous-répertoires). Pour une belle solution remplaçant les fichiers sélectionnés dans un arbre, j'utiliserais find :
find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
Le *.html
est l'expression à laquelle les fichiers doivent correspondre, le .bak
après le -i
fait une copie du fichier original, avec une extension .bak (cela peut être n'importe quelle extension que vous aimez) et le g
à la fin de l'expression sed indique à sed de remplacer plusieurs copies sur une ligne (plutôt que la première uniquement). Le -print
à trouver est une commodité pour montrer quels fichiers ont été mis en correspondance. Tout cela dépend des versions exactes de ces outils sur votre système.