用带有参数的自定义函数的输出替换 sed 中的日期字符串

Replace a date string in sed with the ouput of a custom function with arguments

我有一个 bash 脚本,它回显一个 html 文件,例如 这个 ./foo.sh > out.html 在 html 中有时间戳 以下格式 2019-02-24T17:02:19Z

我写了一个函数来 将时间戳转换为时间戳之间的时间增量 现在。

my_uptime(){
    START=$(date -d "" "+%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 [=11=])/"

这失败了,因为命令替换无法识别 反向引用并放入文字 0。还有别的办法吗 实现这个?最好直接在流中。

... | sed -r "s/[0-9\-]+T[0-9:]+Z/$(my_uptime [=10=])/"

此代码试图将来自 sed 的 s/// 的匹配值传递给 shell 函数。然而,$(...) 在 sed 甚至看到它之前就已经展开了。

在这里使用 sed 可能不合适。

这是一个 perl 替代品,它有效地结合了您的 shell 函数和 sed:

... | perl -ple '
    if (/([0-9-]+T[0-9:]+Z)/) {
        $s = `date -d "" +%s`;
        $n = time;
        $h = int(($n-$s)/3600);
        $m = int(($n-$s)/60)%60;
        $_ = "Uptime $h h $m min";
    }'

您或许可以在 awk 中做类似的事情。