【问题标题】:Perform string manipulation on a value and return the original JSON document with jq对一个值执行字符串操作并使用 jq 返回原始 JSON 文档
【发布时间】:2017-10-24 15:57:30
【问题描述】:

在我的 JSON 文档中,我有一个需要处理的字符串,然后返回带有“固定”值的整个文档。

输入文档是:

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

            },
            {
                "time": "123456789000"
            }

    ]
}

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

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

            },
            {
                "time": "123456789"
            }

    ]
}

我一直在尝试理解 jq 查询语法,但我做错了。在过滤特定值时,我仍在努力返回整个文档。到目前为止,我只有:

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

【问题讨论】:

    标签: json edit jq


    【解决方案1】:

    这是使用|=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

    【讨论】:

    • 完美。谢谢!
    【解决方案2】:

    带有jq sub()功能:

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

    输出:

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

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

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

    【讨论】:

    • 使用tonumber而不使用tostring当然会产生一个数字:-)
    • @peak,再次)
    • 使用sub, ...$ 应该足以作为更简单的正则表达式;最初的问题似乎并没有表明应该只修剪 time 值的一个子集。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 我很惊讶。看起来我在工作中的 jq 版本已经过时了。我今天下午正在尝试,但得到“无法用整数索引字符串”。
    • 是使用数字索引字符串还是 jq-1.4 中新增的更新赋值运算符?在后一种情况下,我今天下午可能只是打错了字,我会删除我的答案,因为那是我真正想做的事情,而且无论如何我都在使用更新赋值运算符。
    • jq 1.3 不支持对字符串进行切片,例如jq1.3 -n '"abc" | .[0:-1]' 产生:jq:错误:无法用对象索引字符串
    • jq 1.3 甚至没有 join/1 或 explode/0 !
    • 就像我说的,我也很惊讶。我很确定我有 jq-1.5 在工作。看来我做错了什么。
    猜你喜欢
    • 2020-06-29
    • 2013-11-29
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2012-07-06
    • 2018-11-28
    相关资源
    最近更新 更多