• Publicidad

Extraer párrafo delimitado por signos o renglón en blanco.

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

Extraer párrafo delimitado por signos o renglón en blanco.

Notapor tool12 » 2014-11-08 10:00 @458

Estimados, primero que todo felicitarlos por el foro, ya llevo algunas semanas siguiéndolos y la verdad soy nuevo en este mundo, pero gracias a ustedes pude aprender a cómo respaldar la configuración de equipos Cisco con el módulo Net::Telnet::Cisco.

Ahora mi problema es el siguiente: necesito buscar en los respaldos un argumento (por lo general éste da inicio al párrafo que deseo mostrar) y que me muestre en pantalla el párrafo completo en el cual se encuentra; la delimitación del párrafo son los signos de "!".

El nombre del archivo y el argumento a buscar se solicitan por pantalla, los únicos argumentos que usaré son: interface, router e ip route (este último no sé si es válido como argumento ya que tiene espacio).

Idea básica:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. print "Ingrese la ruta del archivo a analizar:\n";
  4. $archivo=<STDIN>;
  5. chomp $archivo;
  6. print "Ingrese parámetro a buscar (<span style="font-style: italic">interface</span>, <span style="font-style: italic">route</span>, <span style="font-style: italic">ip route</span>, etc.):\n";
  7. $argumento=<STDIN>;
  8. chomp $argumento;
  9.  
  10. open FILE, '<', "$archivo";
  11. while (<FILE>) {
  12.     if ??????? ;      #Help
  13.         print ??????; #Help
  14.     }
  15.  
  16.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Ejemplo de un archivo de respaldo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
!
!
interface FastEthernet0/0
 ip address 200.200.200.201 255.255.255.0
 duplex auto
 speed auto
!
interface FastEthernet0/1
 ip address 192.168.10.1 255.255.255.0
 duplex auto
 speed auto
!
interface FastEthernet1/0
 ip address 172.16.0.1 255.255.0.0
 duplex auto
 speed auto
!
router ospf 1
 log-adjacency-changes
 network 172.16.0.0 0.0.255.255 area 0
 network 192.168.10.0 0.0.0.255 area 0
 network 200.200.200.0 0.0.0.255 area 0
!
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Al ingresar el argumento "interface", deseo que el resultado por pantalla sea el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
interface FastEthernet0/0
 ip address 200.200.200.201 255.255.255.0
 duplex auto
 speed auto
 
interface FastEthernet0/1
 ip address 192.168.10.1 255.255.255.0
 duplex auto
 speed auto
 
interface FastEthernet1/0
 ip address 172.16.0.1 255.255.0.0
 duplex auto
 speed auto

 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Un segundo caso sería algo similar, pero el párrafo estaría delimitado por renglones en blanco.

Ejemplo de archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Piloto: Persona que gobierna y dirige un buque en la navegación.
Segundo de un buque mercante.
Persona que dirige un automóvil, un globo, etc.
En algunos aparatos, instalaciones, etc., señal luminosa que indica que están en funcionamiento o que transmite otras informaciones.
Persona que guía u orienta en cualquier asunto.

Puente: Construcción de piedra, ladrillo, madera, hierro, hormigón, etc., que se construye y forma sobre los ríos, fosos y otros sitios, para poder pasarlos.
Suelo que se hace poniendo tablas sobre barcas, odres u otros cuerpos flotantes, para pasar un río.
Tablilla colocada perpendicularmente en la tapa de los instrumentos de arco, para mantener levantadas las cuerdas.

Árbol: Planta perenne, de tronco leñoso y elevado, que se ramifica a cierta altura del suelo.
Pieza de hierro en la parte superior del husillo de la prensa de imprimir.
En los órganos, eje que, movido a voluntad del ejecutante, hace que suene o deje de sonar el registro que este desea.
Punzón con cabo de madera y punta de acero, que usan los relojeros para horadar el metal.
Cuerpo de la camisa, sin las mangas.
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Al buscar argumento "Piloto" deseo que muestre:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Piloto: Persona que gobierna y dirige un buque en la navegación.
Segundo de un buque mercante.
Persona que dirige un automóvil, un globo, etc.
En algunos aparatos, instalaciones, etc., señal luminosa que indica que están en funcionamiento o que transmite otras informaciones.
Persona que guía u orienta en cualquier asunto.

 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


He leído varios mensajes pero no logro comprender el cómo buscar con ese tipo de delimitadores.

Desde ya agradezco su ayuda.
Última edición por explorer el 2014-11-08 10:24 @475, editado 1 vez en total
Razón: usare => usaré; parrafo => párrafo; basica => básica; parametro => parámetro
tool12
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2014-11-08 08:07 @380

Publicidad

Re: Extraer párrafo delimitado por signos o renglón en blanc

Notapor explorer » 2014-11-08 11:43 @529

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

Eso se puede solucionar fácil con el operador '..' (rango).

Para el primer caso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. print "Archivo a analizar: ";
  6. my $archivo = <>;
  7. chomp $archivo;
  8.  
  9. print "Ingrese parámetro a buscar (interface|route|ip route):";
  10. my $argumento = <>;
  11. chomp $argumento;
  12.  
  13. my $delimitador = qr/[!]/;                              # delimitador de final de párrafo
  14.  
  15.  
  16. open my $FILE, '<', $archivo;
  17.  
  18. while (<$FILE>) {                                       # recorremos todas las líneas
  19.  
  20.     if (my $l = /^$argumento/ .. /^$delimitador$/) {    # si la línea está dentro del rango que buscamos
  21.         if ($l =~ /E0$/) {                              # la pintamos, salvo que sea la última del párrafo
  22.             print "\n";                                 # en la que solo sacaremos un avance de línea
  23.         }
  24.         else {
  25.             print;                                      # para todas las demás líneas del párrafo, las sacamos tal cual
  26.         }
  27.     }
  28.  
  29. }
  30.  
  31. close $FILE;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Como ves, indicamos cómo queremos que sea párrafo: desde qué línea a qué linea. Si la línea que estamos leyendo en el momento está en el párrafo que queremos, la sacamos, salvo la última línea, que no nos vale ya que queremos sacar un solitario '!', sino un simple avance de línea.

En el segundo caso, hay que modificar dos líneas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. print "Archivo a analizar: ";
  6. my $archivo = <>;
  7. chomp $archivo;
  8.  
  9. print "Ingrese una definición a buscar:";
  10. my $argumento = <>;
  11. chomp $argumento;
  12.  
  13. my $delimitador = qr//;                                 # delimitador de final de párrafo
  14.  
  15.  
  16. open my $FILE, '<', $archivo;
  17.  
  18. while (<$FILE>) {                                       # recorremos todas las líneas
  19.  
  20.     if (my $l = /^$argumento:/ .. /^$delimitador$/) {   # si la línea está dentro del rango que buscamos
  21.         if ($l =~ /E0$/) {                              # la pintamos, salvo que sea la última del párrafo
  22.             print "\n";                                 # en la que solo sacaremos un avance de línea
  23.         }
  24.         else {
  25.             print;                                      # para todas las demás líneas del párrafo, las sacamos tal cual
  26.         }
  27.     }
  28. }
  29.  
  30. close $FILE;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Aunque... en este segundo caso, se puede simplificar un poco:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. print "Archivo a analizar: ";
  6. my $archivo = <>;
  7. chomp $archivo;
  8.  
  9. print "Ingrese una definición a buscar:";
  10. my $argumento = <>;
  11. chomp $argumento;
  12.  
  13.  
  14. open my $FILE, '<', $archivo;
  15.  
  16. while (<$FILE>) {                               # recorremos todas las líneas
  17.  
  18.     if (/^$argumento:/ .. /^$/) {               # si la línea está dentro del rango que buscamos
  19.         print;                                  # la sacamos tal cual
  20.     }
  21. }
  22.  
  23. close $FILE;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No hemos hablado de la codificación de caracteres. Tal cual está así, funciona, pero podría haber problemas si no coincide la codificación del archivo con lo que lee el programa por el teclado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
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 4 invitados