我使用带有json输出的AWS CLI命令,它创建了一个数组:
aws lambda list-functions --region us-east-2 --query 'Functions[?starts_with(FunctionName, `DEV`) == `true`].FunctionName' --output json
哪个返回:
[
"DEV-Lambda1-xxxx",
"DEV-Lambda2-xxxx",
"DEV-Lambda3-xxxx",
"DEV-Lambda4-xxxx"
]
为了正确使用Terraform中的输出,我需要它是一个JSON对象。下面是一个简化的例子:
{
"lambda1": "DEV-Lambda1-xxxx",
"lambda2": "DEV-Lambda2-xxxx",
"lambda3": "DEV-Lambda3-xxxx",
"lambda4": "DEV-Lambda4-xxxx"
}
我想使用jq
1.5或更高版本。如何将数组转换为对象?
我只能走到这一步:
map( { ("lambda"): . } ) | add
只输出最后一个lambda:
{
"lambda": "DEV-Lambda4-xxxx"
}
您可以在数组上进行范围迭代,并形成所需的k/v对
jq '[ range(0; length) as $r |
{ ( .[$r] | split("-")[1] | ascii_downcase) : .[$r] } ] | add'
jqplay-演示(1(
或者对阵列进行换位并形成k/v对
jq --slurp 'transpose |
map( { ( .[] | split("-")[1] | ascii_downcase) : .[] } ) | add'
jqplay-演示(2(
另一种方法可以是使用to_entries | map(…) | from_entries
或其快捷方式with_entries(…)
。
然后根据静态字符串和数字索引更改密钥:
jq 'with_entries(.key |= "lambda(.+1)")'
演示
或者在值中间部分的小写版本上:
jq 'with_entries(.key = ((.value / "-")[1] | ascii_downcase))'
演示
{
"lambda1": "DEV-Lambda1-xxxx",
"lambda2": "DEV-Lambda2-xxxx",
"lambda3": "DEV-Lambda3-xxxx",
"lambda4": "DEV-Lambda4-xxxx"
}