使用JQ使用另一个JSON的值更新一个JSON文件值
所以我有两个JSON文件:使用JQ使用另一个JSON的值更新一个JSON文件值,json,merge,updates,jq,Json,Merge,Updates,Jq,所以我有两个JSON文件: bosh.json: { "key_pair_name": "my-aws-keypair", "ssh_private_key": "my-key-name", "trusted_certificates": "my-trusted-certs" } { "trusted_certificates": "vault-supplied-value", "vm_password_type": "generate" } model.json: {
bosh.json:
{
"key_pair_name": "my-aws-keypair",
"ssh_private_key": "my-key-name",
"trusted_certificates": "my-trusted-certs"
}
{
"trusted_certificates": "vault-supplied-value",
"vm_password_type": "generate"
}
model.json:
{
"key_pair_name": "my-aws-keypair",
"ssh_private_key": "my-key-name",
"trusted_certificates": "my-trusted-certs"
}
{
"trusted_certificates": "vault-supplied-value",
"vm_password_type": "generate"
}
我想用bosh.json文件更新model.json文件,如下所示:
{
"trusted_certificates": "my-trusted-certs",
"vm_password_type": "generate"
}
我试过这个:
jq --argfile bosh bosh.json '. += $bosh' model.json
但是我的钥匙太多了
{
"trusted_certificates": "my-trusted-certs",
"vm_password_type": "generate",
"key_pair_name": "my-aws-keypair",
"ssh_private_key": "my-key-name"
}
及
也一样
{
"trusted_certificates": "my-trusted-certs",
"vm_password_type": "generate",
"key_pair_name": "my-aws-keypair",
"ssh_private_key": "my-key-name"
}
而这
jq --argfile bosh bosh.json '. = $bosh' model.json
产生错误的键
{
"key_pair_name": "my-aws-keypair",
"ssh_private_key": "my-key-name",
"trusted_certificates": "my-trusted-certs"
}
有人知道如何使用jq获得预期的结果吗?
顺便说一句,我不能将密钥的值用于更新,因为我将在其他排列中产生意外的结果…jq解决方案:
jq --argfile bosh bosh.json 'with_entries(
if $bosh[.key] then .value = $bosh[.key] else . end)' model.json
输出:
{
"trusted_certificates": "my-trusted-certs",
"vm_password_type": "generate"
}
-仅更新匹配键的模型值如果$bosh[.key],那么.value=$bosh[.key]else。结束
reduce keys[] as $k (.; if $bosh|has($k) then .[$k] = $bosh[$k] else . end)
然后命令:
jq --argfile bosh bosh.json -f bosh.jq model.json
实际上将发出model.json的编辑版本
与_条目一起使用
如果您更喜欢无减少的方法,请考虑:
with_entries(.key as $k | if $bosh|has($k) then .value = $bosh[$k] else . end )
请注意,
if$bosh | has($k).
与if$bosh[$k].
@RomanPerekgrest-这应该是:带有_条目(.key as$k | if$bosh | has($k)then.value=$bosh[$k]else.end)谢谢@peak。这两种解决方案都能很好地工作。在输入(都是JSON)的情况下,应该修改什么?