¿Quiere decir buscar y reemplazar una cadena en todos los archivos que coincidan con grep?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
Editar
Dado que esta parece ser una pregunta bastante popular, pensé en actualizar.
Hoy en día uso principalmente ack-grep
ya que es más fácil de usar. Entonces el comando anterior sería:
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
Para manejar los espacios en blanco en los nombres de los archivos, puede ejecutar:
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
puedes hacer más con ack-grep
. Digamos que desea restringir la búsqueda solo a archivos HTML:
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
Y si el espacio en blanco no es un problema, es aún más corto:
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
Esto parece ser lo que quieres, según el ejemplo que diste:
sed -i 's/foo/bar/g' *
No es recursivo (no descenderá a subdirectorios). Para una buena solución reemplazando archivos seleccionados a lo largo de un árbol, usaría find:
find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
El *.html
es la expresión que deben coincidir los archivos, el .bak
después del -i
hace una copia del archivo original, con una extensión .bak (puede ser cualquier extensión que desee) y el g
al final de la expresión sed le dice a sed que reemplace varias copias en una línea (en lugar de solo la primera). El -print
to find es una conveniencia para mostrar qué archivos se están emparejando. Todo esto depende de las versiones exactas de estas herramientas en su sistema.