我需要把一个文件的json键作为一个数组在shell脚本我怎么能做到这一点?
{
"employee4" : {
"aliases" : { }
},
"employee3" : {
"aliases" : { }
},
"employee" : {
"aliases" : { }
},
"employee2" : {
"aliases" : { }
}
}
我需要有一个数组,像键["employee", "employee2", "employee3", "employee4"]如果有更多的键,数组需要找到它们
jq
keys
函数返回一个键列表。因此,对于data.json
中的示例数据,我们看到:
$ jq 'keys' data.json
[
"employee",
"employee2",
"employee3",
"employee4"
]
删除JSON列表,我们运行:
$ jq -r 'keys[]' data.json
employee
employee2
employee3
employee4
将其放入bash
数组:
myarray=( $(jq -r 'keys[]' data.json) )
正如@glennjackman在评论中提到的,如果键包含空格或shell特殊字符,上述结构将出现问题。例如,给定以下数据:
{
"employee*" : {
"aliases" : { }
}
}
如果您的目录包含文件命名为employee1
和employee2
,那么您将有效地得到:
myarray=( employee1 employee2 )
…这不是你想要的。您可以通过使用内置的mapfile
(也称为readarray
,这使其目的更加明显)来修复此问题:
mapfile -t myarray < <(jq -r 'keys[]' data.json)
json解析器xidel可以做你想做的。
返回JSON键/属性:
$ xidel -s input.json -e '$json()' # or -e 'map:keys($json)'
employee4
employee3
employee
employee2
创建Bash数组:
$ mapfile -t myArr < <(xidel -s input.json -e '$json()')
或者,xidel
也可以使用--output-format=bash
:
$ eval "$(xidel -s input.json -e 'myArr:=$json()' --output-format=bash)"
在这两种情况下,这将导致:
$ printf '%sn' "${myArr[*]}" ${#myArr[*]} ${myArr[0]} ${myArr[1]}
employee4 employee3 employee employee2
4
employee4
employee3