我有一个bash脚本,回复了像这样的./foo.sh > out.html
的html文件在html中有以下格式2019-02-24T17:02:19Z
的时间戳。
我写了一个函数来将时间戳转换为时间戳和现在之间的时间差。
my_uptime(){
START=$(date -d "$1" "+%s")
NOW=$(date "+%s")
STD=$(echo "($NOW-$START)/3600" | bc)
MIN=$(echo "(($NOW-$START)/60)%60" | bc)
echo "Uptime $STD h $MIN min"
}
现在我想直接在流中用my_uptime
的输出替换时间戳。我试过这个:
echo "<p>some html</p>
2019-02-24T17:02:19Z
<p>some more html</p>" | sed -r "s/[0-9\-]+T[0-9:]+Z/$(my_uptime \0)/"
这会失败,因为命令替换不识别后引用并放入文字0
。还有另一种方法来实现这一目标吗?优选直接在流中。
... | sed -r "s/[0-9\-]+T[0-9:]+Z/$(my_uptime \0)/"
此代码试图将匹配的值从sed的s///
传递给shell函数。然而,$(...)
在sed甚至看到它之前扩大了。
在这里使用sed可能不合适。
这是一个有效结合shell函数和sed的perl替换:
... | perl -ple '
if (/([0-9-]+T[0-9:]+Z)/) {
$s = `date -d "$1" +%s`;
$n = time;
$h = int(($n-$s)/3600);
$m = int(($n-$s)/60)%60;
$_ = "Uptime $h h $m min";
}'
你可以在awk中做类似的事情。