使用 jq 对值和 return 原始 JSON 文档执行字符串操作

Perform string manipulation on a value and return the original JSON document with jq

在我的 JSON 文档中,我有一个需要操作的字符串,然后用 'fixed' 值 return 编辑了整个文档。

输入文档为:

{
    "records" : [
            {
                "time": "123456789000"

            },
            {
                "time": "123456789000"
            }

    ]
}

我想找到 "time" 键并通过删除最后 3 个字符来替换字符串。生成的文档将是:

{
    "records" : [
            {
                "time": "123456789"

            },
            {
                "time": "123456789"
            }

    ]
}

我一直在努力理解 jq 查询语法,但我没有理解正确。在过滤特定值时,我仍在努力 return 整个文档。到目前为止我只有:

.records[] | select(.time | contains("123456789000"))

jqsub()函数:

jq '.records[].time |= sub("[0-9]{3}$";"")' file

输出:

{
  "records": [
    {
      "time": "123456789"
    },
    {
      "time": "123456789"
    }
  ]
}

或者更简单:通过将 time 值除以 1000:

jq '.records[].time |= (tonumber / 1000 | tostring)' file

这是使用 |=string slicing

的解决方案
.records[].time |= .[:-3]

样本运行(假设数据在data.json

$ jq -M '.records[].time |= .[:-3]' data.json
{
  "records": [
    {
      "time": "123456789"
    },
    {
      "time": "123456789"
    }
  ]
}

Try it online at jqplay.org

以下适用于 jq 1.4 或更高版本:

jq '.records[].time |= .[:-3]' file.json

(表达式.[:-3].[0:-3]的简写,这里的负整数从右数开始计算。)

对于 jq 1.3,以下过滤器适用于您的特定情况:

.records[].time |= (tonumber | ./1000 | tostring)