¿Cómo puedo hacer una búsqueda/reemplazo recursivo de una cadena con awk o sed?

Resuelto Tedd asked hace 14 años • 0 respuestas

¿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?

Tedd avatar Oct 18 '09 04:10 Tedd
Aceptado
find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'

-print0indica findque 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á xargstrabajar 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 -odespués es necesario debido a cómo -prunefunciona realmente.

Para más información, ver man find.

Nikita Fedyashev avatar Oct 17 '2009 21:10 Nikita Fedyashev

La forma más sencilla para mí es

grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'
Anatoly avatar Mar 13 '2014 17:03 Anatoly

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.

John Zwinck avatar Oct 18 '2009 19:10 John Zwinck