我需要用
version
的值覆盖属性 image
。问题是,json 文档可以有多种形式,因此部分嵌套可以被展平:
示例文档 1
{
"modulesContent": {
"$edgeAgent": {
"properties.desired.modules.event-bridge-redis": {
"settings": {
"image": "redis:6.2.7",
"createOptions": ""
},
"type": "docker",
"status": "running",
"restartPolicy": "always",
"version": "1.0"
},
"properties.desired.modules.event-bridge-metrics": {
"settings": {
"image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
"createOptions": ""
},
"type": "docker",
"version": "1.0",
"status": "running",
"restartPolicy": "always"
}
},
"$edgeHub": {
}
}
}
示例文档2
{
"modulesContent": {
"$edgeAgent": {
"properties.desired.modules": {
"event-bridge-redis": {
"settings": {
"image": "redis:6.2.7",
"createOptions": ""
},
"type": "docker",
"status": "running",
"restartPolicy": "always",
"version": "1.0"
},
"event-bridge-metrics": {
"settings": {
"image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
"createOptions": ""
},
"type": "docker",
"version": "1.0",
"status": "running",
"restartPolicy": "always"
}
}
},
"$edgeHub": {
}
}
}
示例文档 1 的预期输出
{
"modulesContent": {
"$edgeAgent": {
"properties.desired.modules.event-bridge-redis": {
"settings": {
"image": "redis:6.2.7",
"createOptions": ""
},
"type": "docker",
"status": "running",
"restartPolicy": "always",
"version": "redis:6.2.7"
},
"properties.desired.modules.event-bridge-metrics": {
"settings": {
"image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
"createOptions": ""
},
"type": "docker",
"version": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
"status": "running",
"restartPolicy": "always"
}
},
"$edgeHub": {
}
}
}
示例文档2的预期输出
{
"modulesContent": {
"$edgeAgent": {
"properties.desired.modules": {
"event-bridge-redis": {
"settings": {
"image": "redis:6.2.7",
"createOptions": ""
},
"type": "docker",
"status": "running",
"restartPolicy": "always",
"version": "redis:6.2.7"
},
"event-bridge-metrics": {
"settings": {
"image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
"createOptions": ""
},
"type": "docker",
"version": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
"status": "running",
"restartPolicy": "always"
}
}
},
"$edgeHub": {
}
}
}
是否可以定义一个 jq 查询,它可以处理多种形式的嵌套(从平面形式到嵌套形式),因此输入的形式也保留在输出中?
您可以使用
walk
遍历文档,并使用给定的过滤器(例如将 |=
的值分配给 version
)更新 .settings.image
匹配节点(例如具有 .version
键的对象):
walk(select(type == "object" and has("version")) |= (.version = .settings.image))