对值执行字符串操作并使用 jq 返回原始 JSON 文档

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

在我的 JSON 文档中,我有一个需要操作的字符串,然后使用“固定”值返回整个文档。

输入文档为:

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

            },
            {
                "time": "123456789000"
            }

    ]
}

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

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

            },
            {
                "time": "123456789"
            }

    ]
}

我一直在尝试理解 jq 查询语法,但我不太明白。在过滤特定值时,我仍然在努力返回整个文档。到目前为止我所拥有的只是:

.records[] | select(.time | contains("123456789000"))
json jq
3个回答
4
投票

这是使用

|=
字符串切片

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

示例运行(假设数据在

data.json
中)

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

在 jqplay.org 在线尝试


1
投票

具有 jq

sub()
功能:

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

输出:

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

或更简单:通过将

time
值除以
1000

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

1
投票

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

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

(表达式

.[:-3]
.[0:-3]
的简写;这里的负整数从右开始计数。)

使用 jq 1.3,以下过滤器将在您的特定情况下工作:

.records[].time |= (tonumber | ./1000 | tostring)
© www.soinside.com 2019 - 2024. All rights reserved.