Pues a mí me funciona:
Using perl Syntax Highlighting
#!/usr/bin/env perl
my $texto = q(Registered SIP '20606' at 10.72.20.35 port '37932' [Jun 22 05:00:01] VERBOSE[3559]);
if ($texto =~ / SIP '(.+?)' at (\S+) port '(.+?)' /) {
print "[$1][$2][$3]\n"; # [20606][10.72.20.35][37932]
}
__END__
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Lo importante es saber *todos los casos posibles* que queremos identificar. Y construir un patrón o varios patrones para reconocerlos.
Para extraer el texto sin los corchetes, habría que escaparlos, antes:
\[(.+?)\].
Para aprender expresiones regulares, tienes que empezar por
la introducción que hay en Wikipedia. Allí también hay enlaces externos. Uno lleva a uno de nuestros manuales breves (sección tutoriales, arriba). La versión inglesa de la página tiene alguna cosilla más. Por internet tienes más manuales, pero son de calidad muy voluble. O dan información anticuada.
En Perl (en tu propio ordenador), tienes los siguientes documentos:
- perlre - Expresiones regulares en Perl
- perlrecharclass - Explicación de las clases de caracteres
- perlreref - Referencia rápida de las expresiones regulares
- perlreapi - Descripción de la API para interconectar complementos con el motor de exp. reg.
- perlreguts - Descripción del funcionamiento del motor de exp. reg. de Perl
- perlrequick - Iniciación rápida a las exp. reg. en Perl
- perlrebackslash - Secuencias de escapado con barras diagonales inversas en exp. reg. en Perl
- perlretut - Manual de expresiones regulares en Perl
Algunos de ellos
ya están traducidos.
Es normal que sientas frustración: la definición de los patrones es otro lenguaje, casi independiente del propio Perl. Así que la frustración viene de tener que aprender un lenguaje nuevo. Pero aprenderlo, aunque sea un poco, tiene unos beneficios enormes.
Para extraer cosas como
XXX.XXX.XXX.XXX, se puede hacer de varias formas. Una de ellas es la comentada antes: si sé la posición en la que se encuentra (con respecto al ancla), y sé que se compone de cosas que no son espacio en blanco, rodeado de un par de espacios en blanco, pues eso es lo que pongo:
/at (\S+) /.
Ahora bien, también puedo decir que lo que busco es un conjunto de cuatro números separados por puntos. Entonces otro patrón podría ser:
/(\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3})/Ahí estoy diciendo que quiero capturar (
()) algo consistente en un grupo de uno a tres dígitos, seguidos por un punto, seguidos por grupo de uno a tres dígitos, seguidos por un punto, etc...
Lo mismo para el teléfono:
/(\d{3}-\d{2}-\d{2})/, solo que esta vez indicamos el número exacto de dígitos que esperamos.
Si tienes código que no funciona, intenta reducirlo a unas pocas líneas que formen un programa completo (como hago yo), y nos lo mandas aquí. Así podremos ver dónde está el fallo. Y si pones un ejemplo de la entrada (como también he puesto yo), pues más ayuda será.