如何使用 jq 将 JSON 数组条目添加到 JSON 对象中?

How do I add JSON array entries into a JSON object using jq?

我正在编写一个旨在清理 Route53 记录的脚本,因此我想将数组中的条目添加到 JSON 对象,如下所示

outer.json

{
  "Comment": "Delete record sets for $cluster_name",
  "Changes": [
    {
      "Action": "DELETE",
      "ResourceRecordSet": {}
    }
  ]
}

records.json

[
  {
    "Name": "abcde_svcx.$cluster_name.domain.com.",
    "Type": "TXT",
    "TTL": 300,
    "ResourceRecords": [
      {
        "Value": "\"heritage=external-dns,external-dns/owner=$cluster_name,external-dns/resource=service/svcx/svcx-cluster\""
      }
    ]
  },
  {
    "Name": "svcx.$cluster_name.domain.com.",
    "Type": "A",
    "AliasTarget": {
      "HostedZoneId": "123456789",
      "DNSName": "some-value.elb.us-east-2.amazonaws.com.",
      "EvaluateTargetHealth": true
    }
  }
]

我想要一个如下所示的输出:

output.json

{
  "Comment": "Delete record sets for $cluster_name",
  "Changes": [
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "abcde_svcx.$cluster_name.domain.com.",
        "Type": "TXT",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "\"heritage=external-dns,external-dns/owner=$cluster_name,external-dns/resource=service/svcx/svcx-cluster\""
          }
        ]
      }
    },
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "svcx.$cluster_name.domain.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "123456789",
          "DNSName": "some-value.elb.us-east-2.amazonaws.com.",
          "EvaluateTargetHealth": true
        }
      }
    }
  ]
}

这是否可以使用 jq 在 shell 脚本中完成?

通过将第二个文件的数组项 input[]:

添加到其 first 项的 ResourceRecordSet 字段来更新 |= .Changes 数组
jq '.Changes |= [first | .ResourceRecordSet += input[]]' outer.json records.json
{
  "Comment": "Delete record sets for $cluster_name",
  "Changes": [
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "abcde_svcx.$cluster_name.domain.com.",
        "Type": "TXT",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "\"heritage=external-dns,external-dns/owner=$cluster_name,external-dns/resource=service/svcx/svcx-cluster\""
          }
        ]
      }
    },
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "svcx.$cluster_name.domain.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "123456789",
          "DNSName": "some-value.elb.us-east-2.amazonaws.com.",
          "EvaluateTargetHealth": true
        }
      }
    }
  ]
}

Demo

注意:如果 outer.jsonResourceRecordSet 总是空的,你最好做一个赋值 = 而不是更新添加 +=.