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.