将JSON解析为shell脚本中的数组

我正在尝试将外壳程序脚本中的JSON对象解析为数组。

例如:Amanda,25岁,[http://mywebsite.com]

JSON看起来像:

{

"name" : "Amanda",

"age" : "25",

"websiteurl" : "http://mywebsite.com"

}

我不想使用任何库,最好是可以使用正则表达式或grep。我已经做好了:

myfile.json | grep name

这给了我“名字”:“阿曼达”。我可以为文件中的每一行循环执行此操作,然后将其添加到数组中,但是我只需要右侧而不是整行。

回答:

如果您确实无法使用适当的JSON解析器(例如[1]) ,请尝试

jq

Bash 4.x:

readarray -t values < <(awk -F\" 'NF>=3 {print $4}' myfile.json)

Bash 3.x:

IFS=$'\n' read -d '' -ra values < <(awk -F\" 'NF>=3 {print $4}' myfile.json)

这会将所有属性 存储在Bash数组中${values[@]},您可以使用进行检查

declare -p values

这些解决方案具有局限性:

  • 每个媒体资源必须位于各自的行中,
  • 所有值都必须用双引号引起来,
  • 不支持嵌入式转义的双引号。

所有这些限制加强了推荐使用正确的JSON解析器的建议。


注意:以下替代解决方案使用Bash 4.x + readarray -t values命令,但它们也可以与Bash

3.x替代产品一起使用IFS=$'\n' read -d '' -ra values

:单个grep命令将不起作用(除非您使用 GNU-grep见下文),但增加了cut帮助:

readarray -t values < <(grep '"' myfile.json | cut -d '"' -f4)


-P用于支持PCRE,PCRE支持\K删除到目前为止匹配的所有内容(一种替代后置断言的灵活方法)以及超前断言((?=...)):

readarray -t values < <(grep -Po ':\s*"\K.+(?="\s*,?\s*$)' myfile.json)


最后,这是一个 :

就性能而言,使之成为可行替代方案的是, 在每个循环迭代无需调用外部工具 ; 但是,对于较大的输入文件,基于外部实用程序的解决方案将更快。

#!/usr/bin/env bash

declare -a values # declare the array

# Read each line and use regex parsing (with Bash's `=~` operator)

# to extract the value.

while read -r line; do

# Extract the value from between the double quotes

# and add it to the array.

[[ $line =~ :[[:blank:]]+\"(.*)\" ]] && values+=( "${BASH_REMATCH[1]}" )

done < myfile.json

declare -p values # print the array


[1]这是 外观(Bash 4.x):

readarray -t values < <(jq -r '.[]' myfile.json)

以上是 将JSON解析为shell脚本中的数组 的全部内容, 来源链接: utcz.com/qa/431484.html

回到顶部