2016-08-07 25 views
0

的通過調用JQ 4倍以下命令更新在AWS路線53 JSON模板4個要素:更新多個元素AWS路線53 JSON模板

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個字段?

+0

的可能的複製[?如何讓JQ字段值的多重分配(http://stackoverflow.com/questions/33075323/how-to-make- jq中的多字段值分配) –

+0

顯示的輸出是無效的JSON。另外,如果x.json太長而無法包含,請提供一個簡約的例子。請修復。 – peak

回答

0

您可以只管道每個調用的過濾器,你應該得到相同的結果。

$ 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 
+0

由於模板文件在數組中只有1個項目,因此您的簡單合併代碼可以很好地工作。我知道「=」和「| =」,但看起來像我錯過了「* =」。謝謝。 –

0

下合理簡潔的過濾器應該做的工作在一個簡單的方法,得益於|=功率:

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