使用 JQ 将一个 JSON 文件的值更新为另一个 JSON 的值
Update one JSON file values with values from another JSON using JQ
所以我有两个 JSON 文件:
bosh.json:
{
"key_pair_name": "my-aws-keypair",
"ssh_private_key": "my-key-name",
"trusted_certificates": "my-trusted-certs"
}
model.json:
{
"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"
}
和
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"
}
而这
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"
}
if $bosh[.key] then .value = $bosh[.key] else . end
- 仅更新 模型 的匹配键 的值
要求不是很清楚,但是这里是一种解释的解决方案。可以轻松修改此解决方案以匹配其他明显的解释。
假设文件 bosh.jq 包含以下 jq 程序:
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
如果您更喜欢 reduce-free 方法,请考虑:
with_entries(.key as $k | if $bosh|has($k) then .value = $bosh[$k] else . end )
请注意 if $bosh|has($k) ...
与 if $bosh[$k] ...
不同。
所以我有两个 JSON 文件:
bosh.json:
{
"key_pair_name": "my-aws-keypair",
"ssh_private_key": "my-key-name",
"trusted_certificates": "my-trusted-certs"
}
model.json:
{
"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"
}
和
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"
}
而这
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"
}
if $bosh[.key] then .value = $bosh[.key] else . end
- 仅更新 模型 的匹配键 的值
要求不是很清楚,但是这里是一种解释的解决方案。可以轻松修改此解决方案以匹配其他明显的解释。
假设文件 bosh.jq 包含以下 jq 程序:
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
如果您更喜欢 reduce-free 方法,请考虑:
with_entries(.key as $k | if $bosh|has($k) then .value = $bosh[$k] else . end )
请注意 if $bosh|has($k) ...
与 if $bosh[$k] ...
不同。