在JQ中使用反向引用作为替换字符串

问题描述 投票:0回答:2

假设我想在 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")'

但这一切都没有返回我想要的结果?

regex jq
2个回答
5
投票

在 JQ 中,我们使用命名捕获组来实现这一点。

sub(".*T(?<x>.*)\\..*"; .x)

2
投票

在这种情况下,您可以删除所有直到

T
以及所有以(并包括)带有
.*T|\.[^.]*$
正则表达式的点开头的文本:

s='{"node":"2021-06-10T10:42:30.016+0200"}'
jq '.node |= gsub(".*T|\\.[^.]*$"; "")' <<< "$s"

输出:

{
  "node": "10:42:30"
}

图案详情

  • .*T
    - 任何文本,然后
    T
  • |
    - 或
  • \.
    - 一个点
  • [^.]*
    - 除
    .
  • 之外的零个或多个字符
  • $
    - 字符串结尾。
© www.soinside.com 2019 - 2024. All rights reserved.