bash – ¿Cómo puedo buscar y reemplazar de forma recursiva desde la línea de comando?

Pregunta:

Usando un shell como bash o zshell, ¿cómo puedo hacer un 'buscar y reemplazar' recursivo? En otras palabras, quiero reemplazar cada aparición de 'foo' con 'bar' en todos los archivos de este directorio y sus subdirectorios.

Respuesta:

Este comando lo hará (probado tanto en Mac OS X Lion como en Kubuntu Linux).

# Recursively find and replace in files
find . -type f -name "*.txt" -print0 | xargs -0 sed -i '' -e 's/foo/bar/g'

Así es como funciona:

  1. find . -type f -name '*.txt' busca, en el directorio actual ( . ) y debajo, todos los archivos normales ( -type f ) cuyos nombres terminan en .txt
  2. | pasa la salida de ese comando (una lista de nombres de archivo) al siguiente comando
  3. xargs recopila esos nombres de archivo y los entrega uno por uno a sed
  4. sed -i '' -e 's/foo/bar/g' significa "editar el archivo en su lugar, sin una copia de seguridad, y realizar la siguiente sustitución ( s/foo/bar ) varias veces por línea ( /g )" ( ver man sed )

Tenga en cuenta que la parte 'sin una copia de seguridad' en la línea 4 está bien para mí, porque los archivos que estoy cambiando están bajo control de versión de todos modos, por lo que puedo deshacerlos fácilmente si hubo un error.

Para evitar tener que recordar esto, utilizo un script bash interactivo, de la siguiente manera:

#!/bin/bash
# find_and_replace.sh

echo "Find and replace in current directory!"
echo "File pattern to look for? (eg '*.txt')"
read filepattern
echo "Existing string?"
read existing
echo "Replacement string?"
read replacement
echo "Replacing all occurences of $existing with $replacement in files matching $filepattern"

find . -type f -name $filepattern -print0 | xargs -0 sed -i '' -e "s/$existing/$replacement/g"

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım