如何使用 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
}
}
}
]
}
注意:如果 outer.json
的 ResourceRecordSet
总是空的,你最好做一个赋值 =
而不是更新添加 +=
.
我正在编写一个旨在清理 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
}
}
}
]
}
注意:如果 outer.json
的 ResourceRecordSet
总是空的,你最好做一个赋值 =
而不是更新添加 +=
.