jq递归更新某些元素的值

时间:2018-11-04 21:30:53

标签: json recursion edit jq

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

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

1 个答案:

答案 0 :(得分: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)