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 e
modificador 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
e
modificador parece no eliminar la nueva línea final de la salida del comando Shell, de ahí el chomp
).
Sin embargo, si va a utilizarlo, perl
probablemente 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"