
Estoy buscando una forma sencilla de utilizar expresiones regulares en un script de shell UNIX donde no todos los sistemas tendrán extensiones Perl integradas en grep. Lo que es realmente útil acerca de Perl Regex aquí son las referencias hacia adelante y hacia atrás que no he encontrado una manera de usar de manera efectiva en sed. Rápidamente se me ocurrió la siguiente línea:
tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'
P1. ¿Es esta una forma segura de hacer cosas para Perl? P2. ¿Debería simplemente recurrir a escribir el guión completo en Perl?
Respuesta1
No entiendo por qué su fragmento de Perl está escrito de esta manera. Podrías escribir la expresión regular directamente dentro del script:
perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'
lo que le permite aprovechar la -n
opción (como beneficio adicional, obtiene un informe de error adecuado en caso de que haya un error de entrada). Más uso de modismos de Perl:
perl -ne 'print if /my regex/'
Sed tiene referencias inversas, pero las expresiones regulares extendidas de Perl son más poderosas, hay cosas que no puedes hacer con sed (sed ni siquiera tiene expresiones regulares completas: la alternancia \|
no es una característica estándar, aunque muchas implementaciones la tienen).
La mayor parte de lo que puedes hacer con herramientas tradicionales, puedes hacerlo fácilmente en Perl. Por ejemplo, si desea omitir los primeros bytes K-1, puede escribir
perl -ne 'BEGIN {read ARGV, "", 42-1}; …'
Si desea portabilidad, muchas tareas de procesamiento de texto se pueden realizar en awk, pero awk no tiene ninguna referencia hacia atrás, por lo que extraer texto de una cadena puede ser complicado.