将JSON键放在shell脚本数组中



我需要把一个文件的json键作为一个数组在shell脚本我怎么能做到这一点?

{
"employee4" : {
"aliases" : { }
},
"employee3" : {
"aliases" : { }
},
"employee" : {
"aliases" : { }
},
"employee2" : {
"aliases" : { }
}
}

我需要有一个数组,像键["employee", "employee2", "employee3", "employee4"]如果有更多的键,数组需要找到它们

jqkeys函数返回一个键列表。因此,对于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" : { }
}
}

如果您的目录包含文件命名为employee1employee2,那么您将有效地得到:

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

相关内容

  • 没有找到相关文章

最新更新