我在一个文件中有一些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
所以你可以放多个文件。