我有一个形式的表达式@(<date calculation>)
,我想用 的结果替换它date +%s --date "now<date calculation>"
。因此例如@(-1 day)
将被替换为 的结果date +%s --date "now -1 day"
。
该表达式嵌入在一行文本中,我可以有多个。例如echo hi @(-1 day) bye "@(-1 hour)"
。评估的结果应该是这样的echo hi 1491848561 bye "1491931365"
。所以我只想评估表达式,而不是其他。
我尝试使用 GNU 的 sed 'e' 命令:sed -r 's|@\(([^)]*)\)|date +%s --date "now\1"|e'
,但这会计算整行,而不仅仅是替换的表达式。
我不喜欢使用 sed,所以欢迎任何其他建议,但我很好奇如何使 sed 工作,以了解一般知识
答案1
据我所知,GNU sede
修饰符总是将整个模式空间传递给 shell - 并且该 shell 总是/bin/sh
你可能会更幸运地使用perl
- 例如
$ 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"
(与 不同的是sed
,perl
e
修饰符似乎不会从 shell 命令的输出中删除尾随换行符 - 因此是chomp
)。
但是,如果您打算使用,perl
最好使用可用模块之一来进行日期操作 - 例如
$ 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"