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)
以下 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)