【问题标题】:Updating Multiple Elements to AWS Route 53 JSON Template将多个元素更新到 AWS Route 53 JSON 模板
【发布时间】:2023-03-24 14:02:01
【问题描述】:

以下命令通过调用 jq 4 次来更新 AWS Route 53 JSON 模板中的 4 个元素:

cat x.json | jq '.ChangeBatch.Changes[].Action = "UPSERT"'|\
jq '.ChangeBatch.Changes[].ResourceRecordSet.Name = "host.domain"'|\
jq '.ChangeBatch.Changes[].ResourceRecordSet.Type = "A"'|\
jq '.ChangeBatch.Changes[].ResourceRecordSet.ResourceRecords[].TTL ="300"'\|
jq '.ChangeBatch.Changes[].ResourceRecordSet.ResourceRecords[].Value ="10.120.0.1"'

产生以下正确输出:

{
  "HostedZoneId": "",
  "ChangeBatch": {
  "Comment": "",
  "Changes": [
  {
    "Action": "UPSERT",
    "ResourceRecordSet": {
      "Name": "host.domain",
      "Type": "A",
      "SetIdentifier": "",
      "Weight": 0,
      "Region": "",
      "GeoLocation": {
        "ContinentCode": "",
        "CountryCode": "",
        "SubdivisionCode": ""
      },
      "Failover": "",
      "TTL": 0,
      "ResourceRecords": [
        {
          "Value": "10.120.0.1",
          "TTL": "300"
        }

有没有办法通过一次调用 jq 来更新所有 4 个字段?

【问题讨论】:

标签: json amazon-web-services jq


【解决方案1】:

您可以只对每个调用的过滤器进行管道传输,并且应该得到相同的结果。

$ jq '.ChangeBatch.Changes[].Action = "UPSERT"
    | .ChangeBatch.Changes[].ResourceRecordSet.Name = "host.domain"
    | .ChangeBatch.Changes[].ResourceRecordSet.Type = "A"
    | .ChangeBatch.Changes[].ResourceRecordSet.ResourceRecords[].TTL ="300"
    | .ChangeBatch.Changes[].ResourceRecordSet.ResourceRecords[].Value ="10.120.0.1"' x.json

但是那里有很多重复只是选择您要更新的对象。您可以通过将一个对象与您要设置的值合并来更新多个值。

$ jq '.ChangeBatch.Changes[] *= {
    Action: "UPSERT",
    ResourceRecordSet: {
        Name: "host.domain",
        Type: "A",
        ResourceRecords: [
            {
                TTL: "300",
                Value: "10.120.0.1"
            }
        ]
    }
}' x.json

但是,合并的工作方式是递归合并对象。数组必须手动合并。因此,如果您想保留数组中的项目(如果超过 1 个),则必须将其调整为:

$ jq '.ChangeBatch.Changes[] |= . * {
    Action: "UPSERT",
    ResourceRecordSet: {
        Name: "host.domain",
        Type: "A",
        ResourceRecords: .ResourceRecordSet.ResourceRecords | map(
            . * {
                TTL: "300",
                Value: "10.120.0.1"
            }
        )
    }
}' x.json

【讨论】:

  • 由于模板文件在数组中只有一项,因此您的简单合并代码可以完美运行。我知道“=”和“|=”,但看起来我错过了“*=”。谢谢。
【解决方案2】:

由于|= 的强大功能,以下相当简洁的过滤器应该可以直接完成工作:

.ChangeBatch.Changes[] |= ( .Action = "UPSERT" | .ResourceRecordSet.Name = "host.domain" | .ResourceRecordSet.Type = "A" | .ResourceRecordSet.ResourceRecords[].TTL ="300" | .ResourceRecordSet.ResourceRecords[].Value ="10.120.0.1" )

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2016-11-20
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多