• Publicidad

Coger texto entre dos patrones determinados

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Coger texto entre dos patrones determinados

Notapor n3td1srupt » 2013-07-16 12:07 @547

Hola, foro. Bueno, mi pregunta es esta: me gustaría poder coger el texto que se halla entre dos patrones o entre dos palabras. Lo único que por el momento he podido hacer es cargar en un array el texto y luego analizar los elementos del array en busca de esa secuencia de texto de inicio, y luego vuelvo a recorrer el array en busca de la secuencia final. Sin embargo, esto no es ni elegante ni útil cuando se trata de gran información. Entonces, me gustaría saber cómo proceder para crear una función más efectiva y rápida que esto, además que ni siquiera he hecho funcionar mi anterior idea al 100%.

Gracias,
SAlu2,
¡n3td1srupt!
n3td1srupt
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2012-10-28 15:13 @675

Publicidad

Re: Cojer texto entre dos patrones determinados

Notapor explorer » 2013-07-16 12:13 @551

¿Y cómo sería un ejemplo del texto de entrada?
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: Coger texto entre dos patrones determinados

Notapor n3td1srupt » 2013-07-16 13:36 @608

Bueno, para ser específicos, el texto de entrada proviene del comando
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. apt-cache show "package"
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Concretamente, quiero obtener solo la salida del apartado Description. Por ejemplo, ejecutando
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. apt-cache show gedit
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
, obtengo este resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Package: gedit
Priority: optional
Section: gnome
Installed-Size: 2731
Maintainer: Ubuntu Desktop Team <[email protected]>
Original-Maintainer: Debian GNOME Maintainers <[email protected]>
Architecture: amd64
Version: 3.6.2-0ubuntu1
Depends: python2.7, python (>= 2.7.1-0ubuntu2), python (<< 2.<img src="http://perlenespanol.com/foro/images/smilies/icon_cool.gif" alt="8)" title="Cool" />, libatk1.0-0 (>= 1.12.4), libc6 (>= 2.14), libcairo2 (>= 1.2.4), libenchant1c2a (>= 1.6), libgdk-pixbuf2.0-0 (>= 2.22.0), libgirepository-1.0-1 (>= 0.9.3), libglib2.0-0 (>= 2.33.14), libgtk-3-0 (>= 3.6.0), libgtksourceview-3.0-0 (>= 3.0.0), libice6 (>= 1:1.0.0), libpango1.0-0 (>= 1.14.0), libpeas-1.0-0 (>= 1.1.0), libsm6, libx11-6, libxml2 (>= 2.7.4), libzeitgeist-1.0-1 (>= 0.3.2), gir1.2-atk-1.0, gir1.2-freedesktop, gir1.2-gdkpixbuf-2.0, gir1.2-glib-2.0, gir1.2-gtk-3.0, gir1.2-gtksource-3.0, gir1.2-pango-1.0, gedit-common (>= 3.6), gedit-common (<< 3.7), gsettings-desktop-schemas, python-gi (>= 3.0), python-gi-cairo (>= 3.0), gir1.2-peas-1.0, iso-codes
Recommends: zenity, yelp
Suggests: gedit-plugins
Breaks: gedit-plugins (<< 2.91)
Filename: pool/main/g/gedit/gedit_3.6.2-0ubuntu1_amd64.deb
Size: 525026
MD5sum: be01ff349e91f39a5c0eb5816aaa65b7
SHA1: 71dd08365c8f882501e32ea134e87ccc23d34a5f
SHA256: 5ae0cebd20a90b344ca2117d001ded3106aa165b5d18c16e2d02d4f3a166821c
Description-es: Editor de texto oficial del entorno de escritorio GNOME
 gedit es un editor de texto que tiene la mayoría de las características de
 cualquier editor estándar, extendiendo estas características básicas con
 otras normalmente no encontradas en simples editores de texto. gedit es
 una aplicación gráfica que permite editar varios archivos de texto en una
 ventana (también conocido como pestañas o MDI).
 .
 gedit permite editar texto internacional ya que usa la codificación UTF-8
 de Unicode para los archivos editados. Su conjunto de características
 básicas incluyen resaltado de sintaxis para código fuente, autotabulación,
 impresión y previsualización de la impresión.
 .
 gedit también es ampliable mediante su sistema de extensiones, que
 actualmente permite hacer comprobaciones ortográficas, comparar archivos,
 visualizar los archivos de registro de CVS y ajustar los niveles de
 tabulación.
Homepage: http://www.gnome.org/projects/gedit/
Description-md5: 5091aaf6659e6bf7ca9b32695a59f9cd
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
Supported: 9m
Task: ubuntu-desktop, ubuntu-usb, edubuntu-desktop, edubuntu-usb, ubuntustudio-desktop, ubuntu-gnome-desktop
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien, solo quiero obtener desde el apartado Description-es hasta Description-md5. Esto lo hago así porque ejecutando el comando sobre varios paquetes siempre se usa la misma estructura de información, entonces si solo quiero obtener la descripción, la etiqueta de entrada sería Description-es: y la de final sería Description-md5:.

Gracias.
n3td1srupt
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2012-10-28 15:13 @675

Re: Coger texto entre dos patrones determinados

Notapor explorer » 2013-07-16 13:59 @624

Entonces es sencillo, usando el operador flip-flop:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -E 'open F, "apt-cache show gedit |"; while (<F>) { print if /^Description-..:/ .. /^Description-md5:/; }'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Incluso puedes entubar la salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
apt-cache show gedit | perl -nE 'print if /^Description-..:/ .. /^Description-md5:/'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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: Coger texto entre dos patrones determinados

Notapor n3td1srupt » 2013-07-16 14:15 @635

Sencillamente, impresionante, impresionante, realmente tengo que hacer un lema:

Cuando explorer codea, Perl se manifiesta. ¡je,je,je!

Muchas gracias de verdad, aunque realmente me cuesta entender el ejemplo porque me parece críptico. Tendré que estudiar mucho, supongo, pero muchas gracias.

SAlu2
¡n3td1srupt!
n3td1srupt
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2012-10-28 15:13 @675

Re: Coger texto entre dos patrones determinados

Notapor explorer » 2013-07-16 14:31 @646

n3td1srupt escribiste:me cuesta entender el ejemplo porque me parece críptico
Bueno... eso es porque estamos en el foro Intermedio :wink:
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: Coger texto entre dos patrones determinados

Notapor n3td1srupt » 2013-07-16 14:42 @654

Gracias de veras.

Es todo parte de un proyecto que espero no dejar atrás como hago con todos los demás, porque me frustro en ciertos lugares...

Este es el código que tenía que diseñar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #       TuxCentre Project
  2. #
  3. #
  4. #       apt-show-description.pl
  5. #
  6. #
  7. #       Thanks to explorer explorer-u254.html &
  8. #       his post post35136.html#p35136
  9. #
  10. #      
  11. #
  12. #       n3td1srupt | Twitter--> @n3td1srupt
  13. #
  14.  
  15. $array=scalar(grep $_,@ARGV); # GET ONLY THE NUMBER OF DEFINED ELEMENTS OF AN ARRAY
  16.  
  17. for ($check=0; $check<$array; $check++ )
  18. {
  19.        
  20.         $info_package=qx(apt-cache show $ARGV[$check] | perl -nE 'print if /^Description-..:/ .. /^Description-md5:/');
  21.         print $info_package,"\n";
  22. }
  23.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
n3td1srupt
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2012-10-28 15:13 @675

Re: Coger texto entre dos patrones determinados

Notapor explorer » 2013-07-16 20:04 @877

Llamar a un programa Perl dentro de otro programa Perl... no es propio de este foro de Intermedio...

Esta es una de las posibles soluciones:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. @ARGV > 0
  4.     or die "Uso: $0 <Debian software name> [ <Debian software name> ... ]\n";
  5.  
  6. foreach my $software (@ARGV) {
  7.  
  8.     open my $APT, '-|', "apt-cache show \Q$software\E";
  9.  
  10.     while (<$APT>) {
  11.         if (my $linea = /^Description-..:/ .. /^Description-md5:/) {
  12.  
  13.             last if $linea =~ /E0$/;    # obviar la última línea
  14.  
  15.             if ($linea == 1) {          # formatear el titular
  16.                 s/^Description.+[:]\s*//;
  17.                 $_ = "$software: " . ucfirst($_) . ('=' x length $_) . "\n";
  18.             }
  19.  
  20.             s/^\s+//;                   # caso del espacio delante de las líneas
  21.             s/^[.]$//;                  # caso de líneas con solo un '.'
  22.  
  23.             print;
  24.         }
  25.     }
  26.  
  27.     print "\n";
  28.  
  29.     close $APT;
  30. }
  31.  
  32. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Probando con apt-show-description.pl gedit joe, sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
gedit: Editor de texto oficial del entorno de escritorio GNOME
========================================================
gedit es un editor de texto que tiene la mayoría de las características de
cualquier editor estándar, extendiendo estas características básicas con
otras normalmente no encontradas en simples editores de texto. gedit es una
aplicación gráfica que permite editar varios archivos de texto en una
ventana (también conocido como pestañas o MDI).

gedit permite editar texto internacional ya que usa la codificación UTF-8
de Unicode para los archivos editados. Su conjunto de características
básicas incluyen resaltado de sintaxis para código fuente, autotabulación,
impresión y previsualización de la impresión.

gedit también es ampliable mediante su sistema de extensiones, que
actualmente permite hacer comprobaciones ortográficas, comparar archivos,
visualizar los archivos de registro de CVS y ajustar los
niveles de tabulación.
Homepage: http://www.gnome.org/projects/gedit/

joe: Amigable editor de texto a pantalla completa
=============================================
Joe (Joe's Own Editor), tiene la apariencia de la mayoría de los editores
de texto: las secuencias de teclas son remanentes de los editores Wordstar
y Turbo C, pero su conjunto de características es mucho más amplio. Joe
tiene todas las características que un usuario de Unix puede esperar: uso
completo de termcap/terminfo, completa integración con Unix al estilo VI,
un poderoso archivo de cofiguración y un sistema de búsqueda con
expresiones regulares. También tiene seis tarjetas de ayuda y referencia
que están siempre disponibles, y una intuitiva, sencilla y bien pensada
interfaz de usuario.

Joe tiene un excelente algoritmo optimizado de actualización de la
pantalla, múltiples ventanas (a través/entre las cuales puede desplazarse)
y carece de la confusa noción de buffers nombrados. Tiene historial de
órdenes, expansión con tabulador en los menús de selección de archivos,
funciones de deshacer y rehacer, (des)indentación y formateo de párrafos,
filtrado de bloques resaltados a través de cualquier orden externa de
Unix, edición de una tubería desde o hacia una orden, y copia, corte,
eliminación o filtrado de bloques de texto.

A través de sencillos archivos de configuración al estilo QEdit, Joe puede
ajustarse para emular editores como Pico o Emacs, así como una completa
imitación de Wordstar, y un modo restrictivo (que deja editar sólo los
archivos especificados en la línea de órdenes). Joe también tiene una
actualización diferida de la pantalla para manejar «typeahead», y asegura que
el diferido no sea pasado por el buffer de la tty. Es usable incluso a 2400
baudios, y funcionará en cualquier tipo de terminal sana.
Homepage: http://joe-editor.sourceforge.net/
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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 Intermedio

¿Quién está conectado?

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

cron