• Publicidad

Reemplazar contenido en archivos de forma recursiva

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Reemplazar contenido en archivos de forma recursiva

Notapor erama » 2006-10-26 00:41 @070

Bien ya con la data que me dieron pude leer los archivos que tiene el contenido que necesito reemplazar, ponerlos en un array y listar los archivos sin repetir, lo que tengo es algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#Mando en un array el listado de los archivos que tienen la cadena que busco
#desde la shell de linux le paso la variable $1
my @array=`grep -Re "esto-es-lo-que-busco" $1`;
#Pongo solo los resultados unicos en un nuevo array
my @unicos = keys %{ {map {$_=>1} @array} };
#lo recorro linea a linea pasandolo a la variable line
foreach $line (@unicos) {
        #como recultado es ruta_del_archivo_:cadena_que_encontro lo separo por los dos puntos
        #obteniendo en $archivo[0] la ruta del archivo desde donde estoy parado
        @archivo=split(":",$line);
        #abro el archivo
        open(ARCH_ORG, "$archivo[0]");
        #pongo cada una de las lineas en un array
        my @lineas_archivo = <ARCH_ORG>; #leer lineas totales
        #cierro el archivo
        close(ARCH_ORG);
        #abro nuevamente el archivo en modo escritura y borro todo
        open (ARCH_DES, ">$archivo[0]");
        #comienzo a leer linea a linea
        foreach $linea_archivo (@lineas_archivo){
                #le saco el espacio a la linea
                chomp($linea_archivo);
                #sustituyo con la expresion regular "esto-es-lo-que-busco" por "esto-es-lo-que-pongo"
                $linea_archivo =~ s/esto-es-lo-que-busco/esto-es-lo-que-pongo/;
                #imprimo la linea en el archivo
                print ARCH_DES $linea_archivo."\n";
                #termino el bucle
        }
        #cierro el archivo
        close (ARCH_DES);
        #cierro el bucle inicial
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


No muestra ningún error ni nada, simplemente que ahí...
¿Qué es lo que estoy haciendo mal? ¿o cómo podría hacerlo de otra manera?

Saludos y gracias.
erama
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2005-05-27 06:40 @319
Ubicación: MDQ

Publicidad

Notapor monoswim » 2006-10-26 07:19 @346

Cuanto tienes estos casos en donde el script no tira los resultados que esperas tienes que ir ejecutando por partes el script y viendo que es lo que tira hasta ese momento, por ejemplo podrías poner luego de cerrar el archivo un

print @array
exit

Para ver que es lo que realmente trajo del archivo...

Y así rápidamente podrás llegar a tu error...

Espero que te sirva

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor explorer » 2006-10-26 12:00 @542

El problema está en el $1, que no funciona igual que en shell. Al entrar en el programa, $1 siempre está indefinido. Los parámetros que pasas al programa están en el array @ARGV.

Deberás cambiarlo por $ARGV[0]. O hacer un $parametro = $ARGV[0]; y luego pasárle $parametro al grep.

Otra forma de resolver el problema sería esta (una de las muchas posibles, claro):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use File::Find::Rule;
use Sysadm::Install 'pie';

my @files = File::Find::Rule->grep( qr/esto-es-lo-que-busco/ )->in( $ARGV[0] );
pie ( sub { s/esto-es-lo-que-busco/esto-es-lo-que-pongo/g; $_ }, @files );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con el módulo File::Find::Rule buscamos los archivos que contengan la cadena de búsqueda, de forma recursiva, y a partir del directorio indicado en el primer parámetro pasado al programa.
Luego, con el 'pie' del módulo Sysadm::Install hacemos una edición de cada fichero, haciendo una simple sustitución, línea a línea.

De forma más 'brusca', se puede hacer desde la misma línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
find . -type f -exec perl -p -i -e 's/esto-es-lo-que-busco/esto-es-lo-que-pongo/g;' {} \;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
cambiando el '.' por el directorio donde estén los ficheros. Incluso no es necesario usar Perl. Hay otros editores de línea que podrían hacer este trabajo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados

cron