É uma boa ideia complementar o shell script com perl apenas para uso de regex?

É uma boa ideia complementar o shell script com perl apenas para uso de regex?

Estou procurando uma maneira simples de utilizar regex em um script de shell UNIX, onde nem todo sistema terá extensões perl incorporadas ao grep. O que é realmente útil sobre o regex perl aqui são as referências de retrocesso/avanço que não encontrei uma maneira de usar efetivamente no sed. Eu rapidamente criei o seguinte forro:

tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'

Q1. Esta é uma maneira segura de fazer coisas em Perl? Q2. Devo apenas recorrer a escrever o script inteiro em perl?

Responder1

Não entendo por que seu trecho Perl está escrito dessa maneira. Você poderia escrever o regexp diretamente dentro do script:

perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'

o que permite que você aproveite a -nopção (como bônus, você obtém relatórios de erros adequados caso haja um erro de entrada). Usando ainda mais expressões perl:

perl -ne 'print if /my regex/'

Sed tem referências anteriores, mas as expressões regulares estendidas do Perl são mais poderosas, há coisas que você não pode fazer com o sed (o sed nem tem expressões regulares completas: a alternância \|não é um recurso padrão, embora muitas implementações o tenham).

A maior parte do que você pode fazer com ferramentas tradicionais, você pode fazer facilmente em Perl. Por exemplo, se quiser pular os primeiros bytes K-1, você pode escrever

perl -ne 'BEGIN {read ARGV, "", 42-1}; …'

Se você deseja portabilidade, muitas tarefas de processamento de texto podem ser realizadas no awk, mas o awk não possui referências anteriores, portanto, extrair texto de uma string pode ser complicado.

informação relacionada