jq 递归更新某些元素的值

jq recursively update values for certain elements

以下 JSON 数据的目的是在 type [=14] 的所有元素中使用 src 的值更新字段 dst 的值=],无论树内的深度如何,同时保留数据的整个结构。

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"
        }
     ]
}

Is this possible with 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)