以下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"
}
]
}
答案 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)