在Bash中,我有一个包含JSON对象作为字符串的变量,例如:
{"results":[{"Name":"blah-1","Version":"1.0"},{"Name":"Some Other Name","Version":"2b-alpha"}]}
我通过拨打curl
来获得此信息。
我想把版本字符串放到bash数组中,这样当我调用printf '%s\n' "${versions[@]}"
时,它会逐行打印每个版本字符串:
1.0
2b-alpha
JSON中可能存在任意数量的这些Version字符串。我怎么能这样做,可以用纯粹的bash来完成,还是我需要grep
或sed
这个命令会是什么样的?
答案 0 :(得分:2)
正如gniourf-gniourf
建议的那样,使用适当的{% for category in eshop.categories %}
{{ category.name }}
{% endfor %}
解析器(如JSON
进行解析,以获得更好的可维护性。做点什么
jq
应将内容打印为
$ echo "$jsonString" | jq -r '.results[] | "\(.Version)"'
我们的想法是1.0
2b-alpha
过滤器jq
选择结果下的所有节点,并提取其下的.results[] | "\(.Version)"
的所有名称。
要将其存储到数组,请使用process-substitution as,
Version
并将数组内容打印为
read -r -a jsonArray < <(echo "$jsonString" | jq -r '.results[] | "\(.Version)"')
有关下载说明,请参阅GitHub-jq-documentation页。
答案 1 :(得分:1)
如果您只需要版本号,则不需要将curl的结果存储在变量中。您可以直接将curl的结果传递给jq:
versions=($(curl 'http://server/path' | jq -r '.results[].Version'))
答案 2 :(得分:-1)
一种方式:
arr=($(echo "$x" | grep -oP '(?<="Version":")[^"]+' ))
其中x
是存储字符串的变量。
o
- 仅提取部分字符串
P
- 使用类似perl的正则表达式,我们正在使用正面看法
您可以像访问它一样访问它:
printf '%s\n' "${arr[@]}"