Reemplazar texto en todos los archivos de directorios y subdirectorios | Algo de Linux

domingo, 12 de octubre de 2008

Reemplazar texto en todos los archivos de directorios y subdirectorios

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"`

4 comentarios:

mauril26 dijo...

Mr Esteban le acaba de salvar la vida a un pobre desdichado... jaja... cuanto drama. en fin, gracias. XD

cyberneto dijo...

Te rifas xD, para los que no tengan Perl instalado el comando "sed" funciona exactamente igual.

Ej.

sed 's/\$\(grub_device\)/\(hd0,1\)/g' 'find ./ -name "*.lst"'

saludos.

Agvztíñ IV

Extremeño dijo...

Como dice cyberneto, el comando sed funciona muy bien e incluso se puede utilizar con una sintaxis más sencilla:

sed -i 's/palabra-vieja/palabra-nueva/g' *.*

Aquí hay más ejemplos:
http://felinfo.blogspot.com/2010/02/reemplazar-texto-en-varios-archivos.html

Esteban M. Navas dijo...

Es evidente que con la cantidad de comandos que tenemos en linux, hay muchas formas de lograr los mismos resultados. El que uno u otro te parezca más o menos fácil, es más bien una opinión personal. Ya escribí un artículo sobre sed. En este trataba de hacer sustituciones de otro modo: con perl.