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 e
modificador 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
e
modificador 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"