使用jq(在另一个级别)使用另一个json更新一个json文件中的密钥对

时间:2017-06-30 04:30:31

标签: json object merge edit jq

我有两个文件:

aws.json:
{
  "access_key_id": "MYSECRETKEYID",
  "secret_access_key": "mysecretaccesskey"
}



model.json:
{
    "access_key_id": "FREDSACCESSKEY",
    "secret_access_key": "fredssecretaccesskey",
    "ntp_servers_string": "1.2.3.4, 5.6.7.8",
    "metrics_ip": null,
    "pagerduty_enabled": false,
    "blobstore_type": "s3",
    "s3_blobstore_options": {
        "endpoint": "https://s3.amazonaws.com",
        "bucket_name": "s3-mybucket",
        "access_key_id": "vault-supplied-key",
        "secret_access_key": "vault-supplied-key",
        "signature_version": "4",
        "region": "us-east-1"
    },
    "database_type": "external"
}

我想使用jq更新s3_blobstore_options键中的几个值,最终结果如下:

result.json:

{
    "access_key_id": "FREDSACCESSKEY",
    "secret_access_key": "fredssecretaccesskey",
    "ntp_servers_string": "1.2.3.4, 5.6.7.8",
    "metrics_ip": null,
    "pagerduty_enabled": false,
    "blobstore_type": "s3",
    "s3_blobstore_options": {
        "endpoint": "https://s3.amazonaws.com",
        "bucket_name": "s3-mybucket",
        "access_key_id": "MYSECRETKEYID",
        "secret_access_key": "mysecretaccesskey",
        "signature_version": "4",
        "region": "us-east-1"
    },
    "database_type": "external"
}

如果值未嵌套,则以下代码可以正常工作:

jq --argfile override aws.json '. + $override' model.json > result.json

任何人都知道如何告诉jq我想更新低级密钥对,而不是触及上级密钥对(即FREDSACCESSKEY)?

1 个答案:

答案 0 :(得分:1)

你可以简单地运行:

jq --argfile aws aws.json '.s3_blobstore_options += $aws' model.json

或者如果jq过滤器在aws.jq中:

jq --argfile aws aws.json -f aws.jq model.json

这里的想法是,在将+应用于JSON对象时,RHS对象中的值优先。

jq程序还有其他方法可以访问aws.json ...

的内容