2010-08-28 8 views
7

Tengo un archivo que contiene una gran cantidad de estos¿Qué estoy haciendo mal en este Perl de una sola línea?

"/watch?v=VhsnHIUMQGM" 

y me gustaría dar salida al código de letras utilizando un perl de una sola línea. Entonces intento

perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt 

pero no imprime nada.

¿Qué estoy haciendo mal?

+1

Ver [ 'perldoc perlrun'] (http://perldoc.perl.org/perlrun.html) –

Respuesta

13

La opción -n procesa cada línea pero no imprime nada. Por lo tanto, debe agregar un print explícito si coincide con éxito.

perl -ne 'while (m/\"\/watch\?v=(.+?)\"/g) { print "$1\n" }' filename.txt 

Otro enfoque, si está seguro de cada línea coincidirá, es utilizar la opción -p que imprime el valor de $_ después del procesamiento, por ejemplo:

perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt 
1

Se puede dividir la cadena "=" en lugar de corresponder:

perl -paF= -e '$_= @F[1]' filename.txt 
6

Su expresión regular está muy bien. No obtendrá ningún resultado porque la opción -n no imprimirá nada. Simplemente envuelve un bucle while (<>) { ... } alrededor de su programa (ejecute perl --help para obtener explicaciones breves de las opciones de Perl).

Lo siguiente usa su expresión regular, pero añada algo de impresión. En el contexto de la lista, las expresiones regulares con la opción /g devuelven todas las capturas. Efectivamente, imprimimos cada captura.

perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat 
+0

¿Vale la pena añadir un' \ n 'de modo que las capturas se separan? –

+0

@PP La opción '-l' maneja eso. – FMc

Cuestiones relacionadas