Evaluar parte de una línea de texto

Evaluar parte de una línea de texto

Tengo una expresión del formulario @(<date calculation>)que quiero reemplazar con el resultado de date +%s --date "now<date calculation>". Entonces, por ejemplo, @(-1 day)se reemplazaría con el resultado de date +%s --date "now -1 day".

La expresión está incrustada en una línea de texto y puedo tener varias. Por ejemplo echo hi @(-1 day) bye "@(-1 hour)". El resultado de la evaluación debería ser algo como echo hi 1491848561 bye "1491931365". Entonces quiero que solo se evalúe la expresión, pero nada más.

Intenté usar el comando sed 'e' de GNU: sed -r 's|@\(([^)]*)\)|date +%s --date "now\1"|e', pero esto evalúa la línea completa, no solo la expresión reemplazada.

No estoy apegado al uso de sed, por lo que cualquier otra sugerencia es bienvenida, pero tengo curiosidad sobre cómo hacer que sed funcione, para conocimientos generales.

Respuesta1

Hasta donde yo sé, el emodificador sed de GNU siempre pasa todo el espacio del patrón al shell, y ese shell siempre es/bin/sh

Quizás tengas más suerte usando perl, por ejemplo

$ 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"

(a diferencia de sed, el perl emodificador parece no eliminar la nueva línea final de la salida del comando Shell, de ahí el chomp).

Sin embargo, si va a utilizarlo, perlprobablemente sea preferible utilizar uno de los módulos disponibles para realizar la manipulación de la fecha, por ejemplo

$ 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"

información relacionada