
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 -n
opçã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.