用带有参数的自定义函数的输出替换 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 中做类似的事情。
我有一个 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 中做类似的事情。