arrays - 将 JSON 字典转换为 Bash 字典?
问题描述
我正在尝试将 aws-cli 命令的输出接收到 Bash 中,并将其用作第二个的输入。我用这个有用的答案成功地将输出保存到变量中:
iid=$(aws ec2 run-instances ...)
并接收这样的输出:
{ "ImageId": "ami-0abcdef1234567890", "InstanceId": "i-1231231230abcdef0", "InstanceType": "t2.micro", ... }
我知道自 v4 以来的 Bash支持关联数组,但我正在努力将一个转换为一个。
我试图在 Bash 中解析字典但收到错误:
分配关联数组时必须使用下标
这是因为Bash dicts 的正确键语法是=
, not :
。
最后,我通过sed使用这个奇妙的答案来访问成员:
echo $iid|sed 's/{//g;s/}//g;s/"//g'|cut -d ':' -f2
我的问题:除了正则表达式之外,还有什么标准方法可以从 JSON 或文本创建 Bash 字典吗?最佳实践?
考虑到我使用的答案的片段,sed 方法可能非常冗长,并且随着键/成员的数量呈指数增长:
for items in `echo $db|sed 's/{//;s/}//'`
do
echo one${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f1`
echo two${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f2`
echo three${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f3`
echo four${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f4`
...
done
对于简单的字典是可以的,但是对于具有数百个键和大嵌套级别的复杂字典,它几乎不适用。
任意字典有统一的方法吗?
PS 我找到了解决相反问题的答案(在 Python 中接收 Bash dict),通过 jq解决任务,从 Bash 到 Bash以及从非常见输入创建 dict ,但没有关于 JSON 的具体内容。我不喜欢使用 jq 和 python 并坚持标准的 Bash 工具集,这个集体答案的大多数答案都使用 3rd-party 工具。有可能吗?
解决方案
将 JSON 对象成员转换为 Bash4+ 的关联数组的一种方法:
#!/usr/bin/env bash
# shellcheck disable=SC2155 # Associative array declaration from JSON
declare -A assoc=$(
jq -r '"(",(to_entries | .[] | "["+(.key|@sh)+"]="+(.value|@sh)),")"' \
input.json
)
# Debug dump the Associative array declaration
typeset -p assoc
样本输出:
declare -A assoc=([InstanceId]="i-1231231230abcdef0" [InstanceType]="t2.micro" [ImageId]="ami-0abcdef1234567890" )
推荐阅读
- python - 用 K-Means 聚类并重塑为彩色图像
- python - Python:无法导入名称 ss
- node.js - NodeJs/React - Multer 上传多个文件
- oracle11g - Oracle DBlink 能够访问除 1 个表之外的所有表
- selenium-webdriver - 如何手动或通过使用 selenium 的自动化处理验证码图像?
- .htaccess - htaccess 有什么问题?
- python - Windows 中 Python3.7 的主管(或类似工具)
- javascript - 如何使用键值对象作为 Angular Material 表的数据源
- r - 如何循环从多个光栅文件中提取值?
- r - 多组按计数和百分比