【问题标题】:Extracting the substring between 2 substrings提取2个子串之间的子串
【发布时间】:2017-05-12 12:42:06
【问题描述】:

在 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 中的出现次数可以是任意数量。我该怎么做,可以用纯 bash 来完成,还是需要 grepsed 以及命令是什么样的?

【问题讨论】:

  • 如果要解析 json,请使用 json 解析器。如果您考虑足够长的时间,您会意识到这是合乎逻辑且有意义的。
  • 使用jq解析json

标签: linux string bash sed grep


【解决方案1】:

一种方式:

arr=($(echo "$x" | grep -oP '(?<="Version":")[^"]+' ))

其中x 是存储字符串的变量。

o - 只提取字符串的一部分 P - 要使用类似 perl 的正则表达式,我们在后面使用正则表达式

你可以像这样访问它:

printf '%s\n' "${arr[@]}"

【讨论】:

    【解决方案2】:

    正如gniourf-gniourf 建议的那样,使用适当的JSON 解析器如jq 进行解析,以获得更好的可维护性。做类似的事情

    $ echo "$jsonString" | jq -r '.results[] | "\(.Version)"'
    

    应该将内容打印为

    1.0
    2b-alpha
    

    想法是jq过滤器.results[] | "\(.Version)"选择result下的所有节点,提取它下Version的所有名称。

    要将其存储到数组中,请使用process-substitution as,

    read -r -a jsonArray < <(echo "$jsonString" | jq -r '.results[] | "\(.Version)"')
    

    并将数组内容打印为

    printf '%s\n' "${jsonArray[@]}"
    

    请参阅GitHub-jq-documentation 页面了解下载说明。

    【讨论】:

    • 你可以使用.results[].Version
    【解决方案3】:

    如果您只需要版本号,则不需要将 curl 的结果存储在变量中。您可以直接将 curl 的结果通过管道传输到 jq:

    versions=($(curl 'http://server/path' | jq -r '.results[].Version'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2023-01-11
      • 2022-09-28
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多