Avaliar parte de uma linha de texto

0

Eu tenho uma expressão do formulário @(<date calculation>) que desejo substituir com o resultado de date +%s --date "now<date calculation>" . Por exemplo, @(-1 day) seria substituído pelo resultado de date +%s --date "now -1 day" .

A expressão é incorporada em uma linha de texto e eu posso ter vários. 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 apenas que a expressão seja avaliada, mas nada mais.

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

Eu não estou ligado ao uso de sed, então qualquer outra sugestão é bem-vinda, mas estou curioso para saber como fazer o trabalho sed, para conhecimento geral

    
por IttayD 11.04.2017 / 20:27

1 resposta

2

Até onde eu sei, o modificador e do GNU sempre passa todo o espaço 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 modificador perl e parece não remover a nova linha à direita da saída do comando shell - daí o chomp ).

No entanto, se você for usar perl , é preferível usar um dos módulos disponíveis para fazer a manipulação de data - 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"
    
por 12.04.2017 / 03:46

Tags