• Publicidad

Expresiones regulares para modificar un archivo

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

Expresiones regulares para modificar un archivo

Notapor desconocido » 2010-11-19 09:55 @455

Hola.

Estoy buscando la forma de generar un archivo a partir de otro:

El original tiene un formato como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[...]
agdfgdfg
weqwe
jtyiyui
Entrada 001 inicio
jdfhjaslfhj skdfjsdjflsjdf sdjfjsd lfjsd
eweiruo  weuriuweo wioeruw
final
ydfos sdfsdf sfs
djasjd asdkjas jalsdj
Entrada 004 inicio
jdasjkdl ajksd
asd asda asdad
final
ajsdklja asjkda asjdaj
aksldkla aksdjka aksdka
[...]
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que quiero es hacer un nuevo archivo añadiendo todas líneas excepto las que están entre Entrada ... final que no se correspondan con un código de entrada concreto que tengo en un array.

Yo he hecho esto, que de momento me añade todas las líneas que no están dentro de un bloque Entrada ... final.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $datos="001:004:003_23:082_232";
  2. my @lista_entradas=split(":",$datos);
  3. my $linea;
  4. my $linea2;
  5.  
  6. @archivo=leer_el_archivo;
  7. @nuevo_archivo=();
  8.  
  9. foreach $linea(@archivo) {
  10.         unless ( $linea =~ /^Entrada/ .. $linea =~ /final$/  ) {
  11.                 @nuevo_archivo=(@nuevo_archivo,$linea);
  12.         }
  13.         else {
  14.                 foreach $linea2(@lista_entradas) {
  15.                         $linea_entera_buscada="Entrada $linea2";
  16.                         next if $linea =~ /^$linea_entera_buscada/ .. $linea =~ /final$/;      
  17.                 }
  18.         }
  19.  
  20. }
  21. @archivo=@nuevo_archivo;
  22. print @archivo;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Lo que he intentado, como se ve, es que la expresión regular de la línea 16 me acepte el contenido de una variable para ir buscando las posibles combinaciones, pero parece que así no se puede.

Supongo que hay alguna forma con más estilo para hacer esto, pero no se me ocurre.

Saludos y gracias.
desconocido
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-11-19 09:32 @439

Publicidad

Re: Expresiones regulares para modificar un archivo

Notapor explorer » 2010-11-19 17:00 @750

Bienvenido a los foros de Perl en Español, desconocido.

Esta es una posible solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3.  
  4. my @lista_entradas = qw(                # códigos a buscar
  5.     001 004 003_23 082_232
  6. );
  7.  
  8.  
  9. open my $fichero, q[<], 'kk.txt';       # Leemos el fichero
  10. open my $salida,  q[>], 'kk1.txt';      # Fichero de salida
  11.  
  12. my $codigo;                             # código de cada sección
  13.  
  14. while (<$fichero>) {                    # por cada línea del fichero de entrada
  15.  
  16.     if (my $n = /^Entrada (\d+)/ .. /^fin/) {     # si estamos en una sección
  17.  
  18.         $codigo = $1 if $n == 1;                  # el código está en la primera línea
  19.    
  20.         next if $codigo ~~ @lista_entradas;       # saltamos a la siguiente línea si el
  21.                                                   # $codigo está en la @lista_entradas
  22.     }
  23.    
  24.     print $salida $_;                   # imprimimos la línea hacia la salida
  25. }
  26.  
  27. close $fichero;
  28. close $salida;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@dv9210:~/Documentos/Desarrollo> ./kk.pl; diff -y kk.txt kk1.txt
agdfgdfg                                                        agdfgdfg
weqwe                                                           weqwe
jtyiyui                                                         jtyiyui
Entrada 001 inicio                                            <
jdfhjaslfhj skdfjsdjflsjdf sdjfjsd lfjsd                      <
eweiruo  weuriuweo wioeruw                                    <
final                                                         <
ydfos sdfsdf sfs                                                ydfos sdfsdf sfs
djasjd asdkjas jalsdj                                           djasjd asdkjas jalsdj
Entrada 004 inicio                                            <
jdasjkdl ajksd                                                <
asd asda asdad                                                <
final                                                         <
ajsdklja asjkda asjdaj                                          ajsdklja asjkda asjdaj
aksldkla aksdjka aksdka                                         aksldkla aksdjka aksdka
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y vemos que las secciones que buscamos, ya no están.
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

Re: Expresiones regulares para modificar un archivo

Notapor desconocido » 2010-11-19 18:59 @832

Perfecto, muchas gracias explorer.
desconocido
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-11-19 09:32 @439


Volver a Básico

¿Quién está conectado?

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