应用文件中的修改



我在一个文件中有一些json内容:content.json

{
"Type": {
"OS": "Windows"
},
"Network": {
"Protocol": "unknown",
"Port": 80
}
}

文件中的一些json更新:updates.json

{
"Network": {
"Protocol": "HTTP"
}
}

如何使用jq读取updates.json并将其内容应用于content.json

CAVEAT:我无法预测updates.json中的内容。jq脚本必须足够聪明,才能应用它发现的任何内容

输出应为:

{
"Type": {
"OS": "Windows"
},
"Network": {
"Protocol": "HTTP",
"Port": 80
}
}

这个脚本几乎完成了我想要的

jq 'add' -s content.json updates.json

结果是:

{
"Type": {
"OS": "Windows"
},
"Network": {
"Protocol": "HTTP"
}
}

但正如你所看到的;端口";条目被删除。

也许;递归加法";运营商*将满足您的需求:

< contents.json  jq --argfile updates updates.json '
. * $updates
'

以下说明了您可以采取的一种方法:

< content.json jq --argfile updates updates.json '
.Network += $updates.Network
'

或者,根据您的确切要求,您可能会考虑:

< content.json jq --argfile updates updates.json '
.Network |= with_entries(select(.value != "unknown"))
| .Network += $updates.Network
'

如果您希望"未知";确定更新:

< content.json jq --argfile updates updates.json '
reduce paths(. == "unknown") as $p (.;
setpath($p; $updates | getpath($p)) )
'

一种更通用的方法:

jq -s 'def multiply:reduce .[] as $i ({}; . * $i);
multiply' content.json updates.json

所以你可以放多个文件。

最新更新