Re: Offtopic: Expresiones regulares, ¡ayudadme!

1999-09-13 Por tema Hue-Bond
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!

1999-09-13 Por tema Antonio Tejada Lacaci
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!

1999-09-11 Por tema Javier Viñuales Gutiérrez
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!

1999-09-10 Por tema Javier Viñuales Gutiérrez
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!

1999-09-10 Por tema Marcelo E. Magallon
 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!

1999-09-10 Por tema Marcelo E. Magallon
 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!

1999-09-10 Por tema jvicente

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!

1999-09-10 Por tema Javier Viñuales Gutiérrez
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!

1999-09-10 Por tema Javier Viñuales Gutiérrez
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!

1999-09-10 Por tema Marcelo E. Magallon
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!

1999-09-10 Por tema Marcelo E. Magallon
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!

1999-09-10 Por tema Marcelo E. Magallon
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