Re: Offtopic: Expresiones regulares, ¡ayudadme!
El viernes 10 de septiembre de 1999 a la(s) 14:34:40 -0600, Marcelo E. Magallon contaba: Learning Perl (2da ed); Randal L. Schwartz Programming Perl (2da ed); Larry Wall et al ambos de O'Reilly, como US$20 cada uno. :^/ ¿No son demasiado baratos? -- Just do it. David Serrano [EMAIL PROTECTED] Linux Registered User no. 87069 http://come.to/Hue-Bond.worldIn love with TuX - Linux 2.2.12 PGP Public key at http://www.ctv.es/USERS/fserrano/pgp_pubkey.asc
Re: Offtopic: Expresiones regulares, ¡ayudadme!
On Fri, 10 Sep 1999 14:54:19 +0200, Javier Viñuales Gutiérrez [EMAIL PROTECTED] wrote: Hola y ante todo perdón por el tema pues se sale de la temática de la lista pero como se que aquí hay más de uno que domina el tema de las expresiones regulares dejo mi questión. Veamos, necesito procesar todo un directorio de ficheros que contienen N líneas tal que: etiqueta[espacios o tab]dato[espacios o tab]arg1 arg2 arg3 arg4 [...] En realidad, el formato de etiqueta no es importante, ya que no es necesario para nada (basta con saber que son tres campos: etiqueta, dato y argumentos, separados por tab o espacios). Bueno, como cada uno ha dado su versión, aquí va la mía en awk/gawk :) --- Fichero test.awk #! /bin/awk -f { strCmd =; # Componemos el mandato de la linea de comandos for (i=3;i=NF;i++) strCmd = strCmd $i; # Inicializamos la cadena de salida al 2o. campo leido strOut = $2; # Ejecutamos el comando while (strCmd | getline tmp) # Añadimos el resultado a una cadena strOut = strOut tmp; # Cerramos el comando close(strCmd); # Imprimimos la cadena de salida print strOut; } Fin fichero test.awk Cheers! Antonio Tejada Lacaci [EMAIL PROTECTED] www.espanet.com/atejada
Re: Offtopic: Expresiones regulares, ¡ayudadme!
On vie, sep 10, 1999 at 02:36:46 -0600, Marcelo E. Magallon wrote: son ` no ' (backticks como en à), en mi teclado ` está al lado del 1. Efectívamente, eso era :) Ahora corre más rápido que con el 'open/close'. Exacto, mira el otro mensaje que mandé... Lo miré, gracias... iré corriendo mañana a la librería técnica que tengo cerca de casa a ver si lo tienen y si no lo pido y se acabó. -- Javier Viñuales Gutiérrez [EMAIL PROTECTED] Webs: http://www.ctv.es/USERS/viguPersonal http://www.ctv.es/USERS/vigu/linux/ ViguLinux PGP public key: http://www.ctv.es/USERS/vigu/vigu.pubkey
Offtopic: Expresiones regulares, ¡ayudadme!
Hola y ante todo perdón por el tema pues se sale de la temática de la lista pero como se que aquí hay más de uno que domina el tema de las expresiones regulares dejo mi questión. Veamos, necesito procesar todo un directorio de ficheros que contienen N líneas tal que: etiqueta[espacios o tab]dato[espacios o tab]arg1 arg2 arg3 arg4 donde: etiqueta=[A-Z ó a-z][00-500]_[0-2000]['X' ó 'x' ó ''] dato=número en coma flotante (xxx.xx) argi= cadenas de caracteres y dejarlas tal que datos[espacios o tab]resultado con: dato=número en coma flotante del fichero de entrada resultado= salida de la orden 'programa arg1 arg2 arg3 arg4' Me estoy empapando en regex y lo he intentado con 'sed' pero nada no soy capaz y me corre cierta prisa. ¿Podría alguien ayudarme porfavor? Muchas gracias. -- Javier Viñuales Gutiérrez [EMAIL PROTECTED] Webs: http://www.ctv.es/USERS/viguPersonal http://www.ctv.es/USERS/vigu/linux/ ViguLinux PGP public key: http://www.ctv.es/USERS/vigu/vigu.pubkey
Re: Offtopic: Expresiones regulares, ¡ayudadme!
Javier Viñuales Gutiérrez escribió: etiqueta[espacios o tab]dato[espacios o tab]arg1 arg2 arg3 arg4 donde: etiqueta=[A-Z ó a-z][00-500]_[0-2000]['X' ó 'x' ó ''] dato=número en coma flotante (xxx.xx) argi= cadenas de caracteres demasiado a prisa, en perl: [a-zA-Z]+\d{3}_\d{1,4}[xX]?\s+[0-9]+.[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+ Tienes que hacer algo como: while () { if (m/^[a-zA-Z]+\d{3}_\d{1,4}[xX]?\s+([0-9]+.[0-9]+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/) { $dato = $1; $resultado = 'programa $2 $3 $4 $5'; print $dato, , $resultado; } } Marcelo
Re: Offtopic: Expresiones regulares, ¡ayudadme!
Marcelo E. Magallon escribió: demasiado a prisa, en perl: ^ Esto trabaja bien: #!/usr/bin/perl while () { if (m/^[a-zA-Z]+\d{3}_\d{1,4}[xX]? \s+([0-9]+\.[0-9]+) ((?:\s+\S+){4})$/x) { print $1, , `programa $2`; } } desde la línea de comando: $ perl -ne \ 'if (m/^[a-zA-Z]+\d{3}_\d{1,4}[xX]?\s+([0-9]+\.[0-9]+)((?:\s+\S+){4})$/) { print $1, , `programa $2`; }' entrada salida perl puede ser muy simple, si te interesa, un buen libro es 'Learning Perl', y por supuesto 'Programming Perl'. Marcelo
Re: Offtopic: Expresiones regulares, ¡ayudadme!
De que autores? Marcelo E. Magallon escribió: demasiado a prisa, en perl: ^ [...] perl puede ser muy simple, si te interesa, un buen libro es 'Learning Perl', y por supuesto 'Programming Perl'. Marcelo
Re: Offtopic: Expresiones regulares, ¡ayudadme!
On vie, sep 10, 1999 at 08:30:17 -0600, Marcelo E. Magallon wrote: demasiado a prisa, en perl: [a-zA-Z]+\d{3}_\d{1,4}[xX]?\s+[0-9]+.[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+ Efectívamente, depurando un poco funciona perfecto si hago: #!/usr/bin/perl -w open(FICHENT,$ARGV[0]) || die Error: No puede abrirse el fichero $ARGV[0]; while (FICHENT) { if (m/^\s*[a-zA-Z]?\d{1,3}?_\d{1,4}?[xX]?\s+([0-9]+.[0-9]+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/){ $dato = $1; $orden = programa $2 $3 $4 $5; open(RESUL,$orden|); while (RESUL) { $resultado=$_; print $dato, \t, $resultado; } close RESUL; } } close FICHENT; Lo único que no llego a comprender es por qué si le añado '$' al final del patrón (tal como me puso Marcelo) me toma únicamente la última línea del fichero de entrada. Gracias a todos en especial a Marcelo y a Ricard cuya solución probaré porque me pica la curiosidad de php hace tiempo, muchas gracias... no sabeis del atasco que me habeis sacado. P.D1: ¿Cómo implementaría en perl el análogo a 'if(argcNUMARGS) exit(1);' de C?. P.D2: Para no dar la lata con perl aquí ¿existe alguna lista de correo en español sobre perl?. -- Javier Viñuales Gutiérrez [EMAIL PROTECTED] Webs: http://www.ctv.es/USERS/viguPersonal http://www.ctv.es/USERS/vigu/linux/ ViguLinux PGP public key: http://www.ctv.es/USERS/vigu/vigu.pubkey
Re: Offtopic: Expresiones regulares, ¡ayudadme!
On vie, sep 10, 1999 at 09:09:38 -0600, Marcelo E. Magallon wrote: #!/usr/bin/perl while () { if (m/^[a-zA-Z]+\d{3}_\d{1,4}[xX]? \s+([0-9]+\.[0-9]+) ((?:\s+\S+){4})$/x) { print $1, , `programa $2`; } } Gracias de nuevo, con gente así da gusto. De todas formas Marcelo, 'print $1, , 'programa $2';' me imprime bien el dato pero no la salida del programa pues me saca por pantalla literalmente 'programa $2', es decir _esa cadena_ y no _la salida_. Lo tuve que resolver como ves en el a-mail posterior mio con un 'open' para que el perl esperara la generación de la salida (tarda un poquito) ¿he hecho una tontería?, lo pregunto porque soy novato total en perl. desde la línea de comando: $ perl -ne \ 'if (m/^[a-zA-Z]+\d{3}_\d{1,4}[xX]?\s+([0-9]+\.[0-9]+)((?:\s+\S+){4})$/) { print $1, , `programa $2`; }' entrada salida ¡Excelente!. perl puede ser muy simple, si te interesa, un buen libro es 'Learning Perl', y por supuesto 'Programming Perl'. Pues si que me interesa, veré a ver dónde los consigo, ¿O'Really quizás?. Saludos y gracias otra vez. -- Javier Viñuales Gutiérrez [EMAIL PROTECTED] Webs: http://www.ctv.es/USERS/viguPersonal http://www.ctv.es/USERS/vigu/linux/ ViguLinux PGP public key: http://www.ctv.es/USERS/vigu/vigu.pubkey
Re: Offtopic: Expresiones regulares, ¡ayudadme!
On Fri, Sep 10, 1999 at 03:14:48PM -0300, [EMAIL PROTECTED] wrote: De que autores? Learning Perl (2da ed); Randal L. Schwartz Programming Perl (2da ed); Larry Wall et al ambos de O'Reilly, como US$20 cada uno. Marcelo
Re: Offtopic: Expresiones regulares, ¡ayudadme!
On Fri, Sep 10, 1999 at 09:43:45PM +0200, Javier Viñuales Gutiérrez wrote: print $1, , `programa $2`; De todas formas Marcelo, 'print $1, , 'programa $2';' son ` no ' (backticks como en à), en mi teclado ` está al lado del 1. Pues si que me interesa, veré a ver dónde los consigo, ¿O'Really quizás?. Exacto, mira el otro mensaje que mandé... Marcelo
Re: Offtopic: Expresiones regulares, ¡ayudadme!
On Fri, Sep 10, 1999 at 07:28:23PM +0200, Javier Viñuales Gutiérrez wrote: P.D1: ¿Cómo implementaría en perl el análogo a 'if(argcNUMARGS) exit(1);' de C?. Lo más parecido a C sería, $#ARGV @ARGV The array @ARGV contains the command line arguments intended for the script. Note that $#ARGV is the generally number of arguments minus one, because $ARGV[0] is the first argument, NOT the command name. See $0 for the command name. o si no scalar(@ARGV). Marcelo