jq递归地更新某些元素的值



下面JSON数据的目的是在typet的所有元素中用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"
}
]
}

这在jq中可能吗?

jq是图灵完备的:-(

这里有一个简单的解决方案:

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

如果您的jq没有walk/1,那么现在可能是升级(到jq1.6(的好时机;否则,你可以从网上获取它的def,例如通过谷歌搜索:jq "def walk"

或者

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

最新更新