Joh*_*y I 5 bash merge json key jq
我在 2 个变量 V1 和 V2 中有 2 个 json 对象。
V1 是
{
"Parameters: {
"a": "value-of-a",
"b": "value-of-b"
}
}
Run Code Online (Sandbox Code Playgroud)
V2是
{
"Parameters": {
"a": "new-value-of-a",
"c": "value-of-c"
}
}
Run Code Online (Sandbox Code Playgroud)
我想用 V2 的值覆盖 V1 的值。我想生成一个新的 JSON,如下所示:
预期的
{
"Parameters": {
"a": "new-value-of-a",
"b": "value-of-b"
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
(
echo '{ "Parameters": { "a": "value-of-a", "b": "value-of-b" } }'\
'{ "Parameters": { "a": "new-value-of-a", "c": "value-of-c" } }'\
| jq --slurp 'reduce .[] as $item ({}; . * $item)'
)
Run Code Online (Sandbox Code Playgroud)
但这会产生
实际的
{
"Parameters": {
"a": "new-value-of-a",
"b": "value-of-b",
"c": "value-of-c"
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我不希望 V1 中不存在的 V2 中的节点出现在结果中。谁能帮我?
如果$.Parameter对象像您的示例一样简单
jq \
--argjson a '{ "Parameters": { "a": "value-of-a", "b": "value-of-b" } }' \
--argjson b '{ "Parameters": { "a": "new-value-of-a", "c": "value-of-c" } }' \
-n '
$a | .Parameters | keys_unsorted as $whitelist
| $b | .Parameters | with_entries( select(.key | IN($whitelist[])) ) as $update
| $a | .Parameters += $update '
Run Code Online (Sandbox Code Playgroud)
如果您有两个文件,您可以(例如)使用input两次而不是--argjson.