• Publicidad

Número de línea en el que aparece un patrón

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Número de línea en el que aparece un patrón

Notapor zolidus » 2014-01-30 19:51 @868

Supongamos que tengo un archivo llamado documento.txt, el cual tiene la siguiente información:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
juan
pedro
boris
bruno
martin
jose
daniel
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y muchos otros nombres más; supongamos también que el nombre de jose aparece únicamente una vez en dicho archivo. ¿Cómo se puede hacer para saber en qué número de línea del archivo aparece el nombre de jose?

Gracias de antemano.
zolidus
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2014-01-30 19:45 @864

Publicidad

Re: Número de línea en el que aparece un patrón

Notapor explorer » 2014-01-30 22:19 @971

Bienvenido a los foros de Perl en Español, zolidus.

La solución es fácil. Ni siquiera tienes que escribir un programa. Te vale con el siguiente comando, en la línea de órdenes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -nle 'print $. and exit if /^jose$/' documentos.txt
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Explicación:
  • la opción -n sirve para hacer un bucle por las líneas de los archivos indicados como argumentos (documento.txt)
  • la opción -l añade un carácter de fin de línea a todos los print() que usemos (somos tan vagos que no queremos escribir "\n" en el código)
  • la opción -e ejecuta el código de una línea que sigue a continuación (lo que está entrecomillado simple)
La opción -n lee una línea cada vez, y la almacena en $_, y ejecuta el código.

En el código, hay una expresión seguida de una pos-condición, así que primero evalúa la condición de la pos-condición (es más fácil leer el código que este rollo).

La condición es una expresión regular. Comprueba si en la variable $_ (la línea leída) hay algo que concuerde con el patrón 'jose', y solo con esas cuatro letras (no nos vale 'juanjose'). Por eso usamos las anclas '^' y '$'.

Si la condición se cumple, se evalúa la expresión, que es un print() y (and) un exit().

El print saca el valor de la variable especial $. que almacena el número de la línea leída dentro del archivo.

Como la ejecución de un print() casi siempre tiene éxito, pues devuelve un valor verdadero, así que Perl comprueba el segundo operador del and, que es un exit(), y exit(), pues... termina el programa (no hace falta seguir buscando más).

Queda más corto decir "imprime el número de línea del archivo y termina si la línea coincide con el patrón 'jose'".

Otra solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -nlE 'print $. and exit if $_ eq "jose"' documentos.txt
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

Re: Número de línea en el que aparece un patrón

Notapor zolidus » 2014-01-30 23:56 @039

Muchas gracias por tu respuesta, explorer. ¿Existe alguna forma de hacer esto dentro de un script? Esto puede hacerse fácilmente mediante al comando grep en bash, pero quiero evitar en la medida de lo que me sea posible a recurrir al uso del comando system():

system("grep -n jose documento.txt")
zolidus
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2014-01-30 19:45 @864

Re: Número de línea en el que aparece un patrón

Notapor explorer » 2014-01-31 05:39 @277

(no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -l
  2. while (<>) {
  3.     print $. and exit if /^jose$/;
  4. }
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 16 invitados