提取2个子串之间的子串

时间:2016-12-28 08:56:57

标签: linux string bash sed grep

在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来完成,还是我需要grepsed这个命令会是什么样的?

3 个答案:

答案 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[@]}"