Avaliar parte de uma linha de texto

Avaliar parte de uma linha de texto

Eu tenho uma expressão no formato @(<date calculation>)que quero substituir pelo resultado de date +%s --date "now<date calculation>". Então, por exemplo, @(-1 day)seria substituído pelo resultado de date +%s --date "now -1 day".

A expressão está embutida em uma linha de texto e posso ter várias. Por exemplo echo hi @(-1 day) bye "@(-1 hour)". O resultado da avaliação deve ser algo como echo hi 1491848561 bye "1491931365". Então, quero que apenas a expressão seja avaliada, mas nada mais.

Tentei usar o comando sed 'e' do GNU: sed -r 's|@\(([^)]*)\)|date +%s --date "now\1"|e', mas isso avalia a linha inteira, não apenas a expressão substituída.

Não sou apegado a usar o sed, então qualquer outra sugestão é bem vinda, mas estou curioso para saber como fazer o sed funcionar, para conhecimento geral

Responder1

Até onde eu sei, o emodificador sed do GNU sempre passa todo o espaço do padrão para o shell - e esse shell é sempre/bin/sh

Você pode ter mais sorte usando perl- por exemplo

$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' | 
    perl -pe 's/@\((.*?)\)/sprintf "%s", $d = `date +%s --date "now $1"`, chomp $d/ge'
For example echo hi 1491874845 bye "1491957645"

(ao contrário de sed, o perl emodificador parece não remover a nova linha final da saída do comando shell - daí o chomp).

Porém se você for usar perlé provavelmente preferível fazer uso de um dos módulos disponíveis para fazer a manipulação de datas - por exemplo

$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' | 
    perl -MDate::Manip=ParseDateDelta,UnixDate -pe 's/@\((.*?)\)/UnixDate(ParseDateDelta($1), "%s")/ge'
For example echo hi 1491875065 bye "1491957865"

informação relacionada