¿Cómo puedo hacer una búsqueda/reemplazo recursivo de una cadena con awk o sed?
¿Cómo encuentro y reemplazo cada aparición de:
subdomainA.example.com
con
subdomainB.example.com
en cada archivo de texto bajo el /home/www/
árbol de directorios de forma recursiva?
find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
-print0
indica find
que se imprima cada uno de los resultados separados por un carácter nulo, en lugar de una nueva línea. En el improbable caso de que su directorio tenga archivos con nuevas líneas en los nombres, esto aún le permitirá xargs
trabajar con los nombres de archivo correctos.
\( -type d -name .git -prune \)
es una expresión que omite por completo todos los directorios nombrados .git
. Puede expandirlo fácilmente, si usa SVN o tiene otras carpetas que desea conservar, simplemente compare con más nombres. Es más o menos equivalente a -not -path .git
, pero más eficiente porque, en lugar de comprobar cada archivo del directorio, lo omite por completo. El -o
después es necesario debido a cómo -prune
funciona realmente.
Para más información, ver man find
.
La forma más sencilla para mí es
grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'
Nota : No ejecute este comando en una carpeta que incluya un repositorio de git; los cambios en .git podrían dañar su índice de git.
find /home/www/ -type f -exec \
sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
En comparación con otras respuestas aquí, esto es más simple que la mayoría y usa sed en lugar de perl, que es lo que pedía la pregunta original.