【问题标题】:jq recursively update values for certain elementsjq 递归更新某些元素的值
【发布时间】:2018-11-04 21:30:52
【问题描述】:

以下 JSON 数据的目的是在 typet 的所有元素中将字段 dst 的值更新为 src 的值,而不管树内的深度如何,同时时间保留数据的整个结构。

jq 可以做到这一点吗?我的几次尝试归结为以下无法达到预期目的的命令:

$ jq -r 'map_values(select(.. | .type? == "t" |= (.dst = .src)))'

{
    "a": "b",
    "c": [
        {
            "type": "t",
            "src": "xx",
            "dst": "zz"
        },
        {
            "type": "t",
            "src": "xx",
            "dst": "zz"
        }
    ],
    "d": [
        {
            "e": [
                {
                    "type": "t",
                    "src": "xx",
                    "dst": "zz"
                }
            ]
        },
        {
            "type": "t2",
            "src": "xx",
            "dst": "zz"
        }
     ]
}

【问题讨论】:

    标签: json recursion edit jq


    【解决方案1】:

    jq 可以吗?

    jq 是图灵完备的 :-)

    这是一个简单的解决方案:

    walk( if type == "object" and .type == "t" then .dst = .src else . end)
    

    如果您的 jq 没有walk/1,那么可能是升级(到 jq 1.6)的好时机;否则,您可以从网络上获取其定义,例如通过谷歌搜索:jq "def walk"

    或者...

    reduce paths as $x (.;
        if (getpath($x)|.type? // false) == "t"
        then setpath( $x + ["dst"]; getpath( $x + ["src"] ))
        else . end)
    

    【讨论】:

    • 有效!谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多