评估文本行的一部分

评估文本行的一部分

我有一个形式的表达式@(<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"

(与 不同的是sedperl 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"

相关内容