A veces queremos sustituir una cadena en todos los los archivos de un directorio y sus subdirectorios de forma recursiva. Ésto es sencillo de hacer utilizando perl. Vamos a verlo por partes:
Cuando queremos sustituir directamente una cadena por otra en un fichero, hacemos algo así:
# perl -p -i -e ‘s/cadenaasustituir/nuevacadena/g’ fichero
Si la sustitución queremos hacerla en todos los ficheros de un subdirectorio, haremos:
# perl -p -i -e ‘s/cadenaasustituir/nuevacadena/g’ *
Si queremos sustituir la cadena en todos los subdirectorios del directorio actual, combinaremos el comando perl con un comando find que busque todos los archivos:
# perl -p -i -e ‘s/cadenaasustituir/nuevacadena/g’ `find ./ -name *`
Y ya para terminar de rematar: Si queremos sustituir una cadena por otra en todos los ficheros con un determinado nombre en todos los subdirectorios del directorio actual:
# perl -p -i -e ‘s/cadenaasustituir/nuevacadena/g’ `find ./ -name «patronabuscar»`
Veamos unos ejemplos:
Sustituir la cadena jose por pepe en el fichero clientes.txt:
# perl -p -i -e ‘s/jose/pepe/g’ clientes.txt
Sustituir la cadena jose por pepe en todos los ficheros del directorio actual:
# perl -p -i -e ‘s/jose/pepe/g’ *
Sustituir la cadena jose por pepe en el directorio actual y en todos sus subdirectorios:
# perl -p -i -e ‘s/jose/pepe/g’ `find ./ -name *`
Sustituir la cadena jose por pepe en todos los ficheros con extensión .txt del directorio actual y de todos sus subdirectorios:
# perl -p -i -e ‘s/jose/pepe/g’ `find ./ -name «*.txt»`
Y un último ejemplo: Sustituir la cadena $(grub_device) por la cadena (hd0,1) en todos los ficheros con extensión .lst del directorio actual y sus subdirectorios:
# perl -p -i -e ‘s/\$\(grub_device\)/\(hd0,1\)/g’ `find ./ -name «*.lst»`