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

问题描述 投票:1回答:1

我有一个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。还有另一种方法来实现这一目标吗?优选直接在流中。

date sed unix-timestamp command-substitution
1个回答
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中做类似的事情。

© www.soinside.com 2019 - 2024. All rights reserved.