Postagem em destaque

Operações aritméticas com expressões regulares


Por si só o termo regex assusta um pouco, ainda mais quando combinado com operações aritméticas que tornam o processo um pouco mais complicado e na maioria dos casos inviáveis. A busca por padrões e substituição de ocorrências sempre nos direciona para a ferramenta sed que apresenta excelentes recursos para tratamento dessas expressões. Porém, em determinadas situações somos forçamos a criar rotinas mais complexas para obter o resultado pretendido e perdemos minutos valiosos nessa tarefa. Mas que situações são essas ? Ou rotinas ? E o que seria inviável fazer usando o comando sed ?

Uma operação aritmética é um exemplo bastante simples e ao mesmo tempo "complexo" para ser solucionado .

Considere o texto a seguir:

valor: 10, valor: 15, valor: 20, valor: 25, valor: 30, valor: 35, valor: 40, valor: 45, valor: 50

O texto é composto por chaves separadas por vírgula e com seus respectivos valores. É claro que vale a pena ressaltar que convenientemente o texto segue um padrão de formatação que em nosso objetivo é irrelevante.

Agora imagine que seja necessário encontrar todos os números dentro da expressão e realizar uma determina operação e substitui-lo pelo resultado, considerando que os valores são aleatórios. Montar tal procedimento utilizando o sed seria um trabalho exaustivo mesmo com script.

A biblioteca regex.sh do projeto bashsrc contém um função chamada regex.fnreplace que auxilia na resolução desse problema.

Protótipo:

func regex.fnreplace <[str]pattern> <[str]exp> <[int]count> <[uint]flag> <[func]funcname> <[str]args> ... => [str]

A função regex.fnreplace invoca uma determinada função a cada ocorrência encontrada na expressão passando como argumento $1 o padrão casado, substitui-o pelo retorno da função.

Exemplo 1:

Dobrando todos os números encontrados na expressão.

Saida:

valor: 20, valor: 30, valor: 40, valor: 50, valor: 60, valor: 70, valor: 80, valor: 90, valor: 100

Exemplo 2:

Aplicando uma condição para dobrar somente os valores maiores que 30, caso contrário mantém o valor original.

Saída:

valor: 10, valor: 15, valor: 20, valor: 25, valor: 30, valor: 70, valor: 80, valor: 90, valor: 100

Observe que somente os 4 últimos valores sofreram alterações.

Exemplo 3:

Aplica uma condição que verifica se o número encontrado é par e adiciona +10 a esse valor, caso seja ímpar o valor será triplicado.

Saída:

valor: 20, valor: 45, valor: 30, valor: 75, valor: 40, valor: 105, valor: 50, valor: 135, valor: 60

A função regex.fnreplace fornece uma grande flexibilidade no tratamento da expressão por meio de função que permite a construção de rotinas mais elaboradas antes de efetuar a substituição. É importante lembrar que as funções em shell só retornam inteiros, sendo absolutamente necessário o uso do comando echo para retorno dos valores modificados a função chamadora (regex.fnreplace).

Comentários

Contato

Nome

E-mail *

Mensagem *