Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/07/2002, 09:02
MMontes
 
Fecha de Ingreso: noviembre-2001
Mensajes: 415
Antigüedad: 23 años, 8 meses
Puntos: 0
Re: Desafío: Expresión regular

Bueno como vi que la expreg que estabas usando era de linea de comandos, supuse que no tendrias problema en usar el perl que tambien tiene buenas expresiones regulares.

perl es un "interprete" (entre comillas, porque no es tan asi), que te permite ejecutar código desde la linea de comandos.
haciendo:
Código:
# perl -e 'print "hola mundo\n";'
se ejecuta el codigo correspondiente.

el parámetro -p hace que se itere leyendo el STDIN. Se emula -de cierta manera- el comportamiento de sed, aunque se pueden usar bloques BEGIN y END para ejecutar ANTES del proceso de compilacion, al igual que en awk.

En perl existe una variable ($_) que toma su valor segun el contexto. En realidad son 3, $_, @_ y %_ (una variable escalar, un array y un array asociativo).

Para ilustrar como "funciona" esa variable te muestro el siguiente ejemplo.

Para imprimir numeros del 1 al 10, se puede hacer:
Código:
foreach my $numero(1..10) { 
  print $numero;
}
el my $numero, en realidad lo que hace es asignar la variable contextual $_ a $numero.
perfectamente puedo hacer:
Código:
foreach (1..10) {
  print $_;
}
como siempre hay una variable contextual del caso (SIEMPRE), se puede obviar la variable:
Código:
foreach (1..10) { print; }
y en una ultima optimización, en perl, si despues de una instrucción se termina un bloque, podemos obviar el ";":
Código:
foreach (1..10) { print }
Entonces lo que hago es basicamente aplicarle una expresión regular al contenido de STDIN.

haciendo:
Código:
cat archivo | perl -pe '$_ = $linea; $linea =~ s/Hoy/Ayer/g; print $linea';
por esas cosas matemágicas de la vida, puedo achicarlo a:
Código:
cat archivo | perl -pe 's/Hoy/Ayer/'
que es lo que hago en la linea que te pase antes.

Eso si, ni pense en la expresión regular, son 3 lineas distintas, 3 expresiones regulares diferentes. Pero el resultado es el mismo :P