我正在尝试将shell脚本中的JSON对象解析为数组。
例如:阿曼达,25,[http://mywebsite.com]
JSON看起来像:
{
"name" : "Amanda",
"age" : "25",
"websiteurl" : "http://mywebsite.com"
}
我不想使用任何库,最好使用正则表达式或grep。我已经完成了:
myfile.json | grep name
这给了我“名字”:我可以对文件中的每一行循环执行此操作,并将其添加到数组中,但我只需要右侧,而不是整行。
4条答案
按热度按时间nnt7mjpx1#
如果您确实无法使用
jq
[1]等合适的JSON解析器,请尝试**awk
的解决方案**:Bash 4.x:
Bash 3.x:
这将所有属性 * 值 * 存储在Bash数组
${values[@]}
中,您可以使用declare -p values
。这些解决方案具有局限性:
所有这些限制都强化了使用适当JSON解析器的建议。
注意:以下替代解决方案使用Bash 4.x+
readarray -t values
命令,但它们也可以与Bash 3.x替代方案IFS=$'\n' read -d '' -ra values
一起使用。grep
+cut
组合:一个grep
命令不行(除非你使用 GNUgrep
-见下文),但是添加cut
会有帮助:GNU
grep
:使用-P
来支持PCRE,PCRE支持\K
删除到目前为止匹配的所有内容(一种比后看Assert更灵活的替代方法)以及前看Assert((?=...)
):最后,这里是一个纯Bash(3.x+)解决方案:
在性能方面,这是一个可行的替代方案,因为 * 在每次循环迭代中都不会调用外部实用程序 *;但是,对于较大的输入文件,基于外部实用程序的解决方案会快得多。
[1]下面是基于
jq
的健壮解决方案的样子(Bash 4.x):readarray -t values < <(jq -r '.[]' myfile.json)
nhhxz33t2#
jq足够好来解决这个问题
这样你就得到了一个表,你可以grep任何行或者awk打印任何列
bnlyeluc3#
您可以使用sed one liner来实现这一点:
结果:
如果你不需要/想要引号,那么下面的sed将去掉它们:
结果:
如果您有多个条目,如
更新:
正如mklement 0在注解中指出的那样,如果文件包含嵌入的空格,例如
"name" : "Amanda lastname"
,则可能会出现问题。在这种情况下,Amanda
和lastname
都将被读入单独的数组字段。为了避免这种情况,您可以使用readarray
,例如,这也将照顾到任何globbing问题,也在评论中提到。
kd3sttzy4#
纯Bash 3.x+,无依赖项(如jq、python、grep等):
输出:
Try it。