Buscar y reemplazar texto en todos los archivos dentro de un directorio y todos los subdirectorios – TIP Linux

Si buscabas como reemplazar texto dentro de varios archivos en una sola linea de comando, has llegado a la web correcta. Muchas veces tenemos que buscar o hacer cambios a un texto determinado y para empezar no sabemos ni en cual archivo, documento o directorio puede estar.

Digamos que le cambiamos la dirección IP al servidor, o cambiamos de servidor web y es necesario hacer los cambios en todos los archivos de configuracion y los donde aparezca la IP del servidor anterior.

Para no estar buscando durante horas entre todos los archivos de nuestro servidor, les escribo aqui los distintos tips para reemplazar strings alfanumericos en linux.

  • Para reemplazar un texto o string cada vez que aparezca en los archivos:

~# find /path/directorio «*.txt» | xargs perl -pi -e ‘s/texto/reemplazo/g’

  • Para reemplazar la primera vez que aparezca el texto:

~# find /path/directorio «*.txt» | xargs perl -pi -e ‘s/texto/reemplazo/’

  • Para reemplazar todos los archivos dentro de un directorio:

~# for arg in `ls -C1`; do perl -pi -e ‘s/texto/reemplazo/g’; done;

Existe infinidad de combinaciones posibles utilizando el shell de la linea de comandos. Tomemos como ejemplo la primera busqueda:

~# for arg in `find /your/home/dir -name «*.txt»` ; do perl -pi -e ‘s/texto/reemplazo/g’ $arg; done;

Muchas veces solamente es necesario buscar un path o una cadena dentro de multitud de ficheros sobre todo en las migraciones, para ello usaremos los siguientes comandos:

grep Busca cadenas dentro de ficheros»» -n señala el nº de la linea donde está la cadena

Ejemplo: grep -n micadena *

Busqueda recursiva de una cadena dentro de multitud de ficheros:

grep -n micadena * -R

Sustituir palabras en un archivo desde consola

Nada de editores de texto, ni de html ni nada por el estilo. Si quieres sustituir palabras que aparecen recurrentemente en un fichero de texto o archivo y necesitas hacerlo rápido, puedes hacerlo con el comando sed.
Por ejemplo, para sustituir un color en una hoja de estilos CSS:

sed ’s/#FF0000/#0000FF/g’ main.css

Encriptar archivos con VIM

Una utilidad muy buena de VIM es la de poder encriptar archivos, la manera de realizarlo es muy sencilla:

$ vim -x archivo.txt

Nos pedirá una contraseña y ya podemos editar el archivo. Si queremos abrirlo con algún otro editor aparecerá encriptado el mensaje, si lo abrimos con vim nos pedirá el password asignado y podremos verlo en texto plano. La verdad es que vim es una navaja suiza, tiene muchas opciones bastante buenas, con esta opción de encriptamiento, ya no tenemos que esconder nuestros archivos los cuales no queremos que vean, simplemente encriptamos y listo.

Recomponer archivos tar.gz que se han descomprimido sin crear directorio

¿A quién no le ha ocurrido? Descargas un fichero.tar.gz en /home/tuuusuario/ , invocas el conjuro para desempaquetar y descomprimir:

tar -xvzf fichero.tar.gz

Y cuando observas el resultado te das cuenta que el muy *HIJO DE ****PIiiI*****uta* se ha descomprimido SIN crear un directorio para el contenido que tiene dentro, o sea, ha dejado todo tu $HOME lleno de ficheros. Es lo que se conoce como una bomba tar.

Bien, el siguiente comando atb (anti-tar-bomb), encontrado en commandlinefu.com, analiza el tar.gz (o .bz2 o .tgz) ANTES de descomprimirlo. Si resulta que se trata de una bomba tar, crea un directorio con el mismo nombre X que el fichero X.tar.gz y luego lo descomprime en X. Magia!

 atb() {shopt -s extglob ; l=$(tar tf $1); if [ $(echo "$l" | wc -l) -eq $(echo "$l" | grep $(echo "$l" | head -n1) | wc -l) ]; then tar xf $1; else mkdir ${1%.t@(ar.gz|ar.bz2|gz|bz|ar)} && tar xf $1 -C ${1%.t@(ar.gz|ar.bz2|gz|bz|ar)}; fi ; shopt -u extglob}