假设我想在 shell 上提取日期/时间字符串的时间部分,我可以这样做:
echo "2021-06-10T10:42:30.016+0200" | sed 's|.*T\(.*\)\..*|\1|g'
这回来了
10:42:30
我怎样才能用
jq
和 sub()
达到同样的效果?
我缺少正确的语法。我找不到任何好的例子。例如。我一直在努力:
jq '<myid> | sub(".*T(.*)\\..*"; "\1")'
jq '<myid> | sub(".*T(.*)\\..*"; "$1")'
jq '<myid> | sub(".*T\\(.*\\)\\..*"; "\1")'
但这一切都没有返回我想要的结果?
在 JQ 中,我们使用命名捕获组来实现这一点。
sub(".*T(?<x>.*)\\..*"; .x)
在这种情况下,您可以删除所有直到
T
以及所有以(并包括)带有 .*T|\.[^.]*$
正则表达式的点开头的文本:
s='{"node":"2021-06-10T10:42:30.016+0200"}'
jq '.node |= gsub(".*T|\\.[^.]*$"; "")' <<< "$s"
输出:
{
"node": "10:42:30"
}
图案详情:
.*T
- 任何文本,然后 T
|
- 或\.
- 一个点[^.]*
- 除 .
$
- 字符串结尾。