当前位置: 首页 > 面试题库 >

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

宦飞
2023-03-14
问题内容

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

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

JSON看起来像:

{
  "name"       : "Amanda", 
  "age"        : "25",
  "websiteurl" : "http://mywebsite.com"
}

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

myfile.json | grep name

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


问题答案:

如果您确实无法使用适当的JSON解析器(例如[1]) ,请尝试 基于的解决方案
jq awk

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 + cut组合:单个grep命令将不起作用(除非您使用 GNU- grep见下文),但增加了cut帮助:

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

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

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

最后,这是一个 纯Bash(3.x +)解决方案

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

#!/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]这是 基于健壮jq的解决方案的外观(Bash 4.x):
readarray -t values < <(jq -r '.[]' myfile.json)



 类似资料:
  • 问题内容: 我想将参数传递给它。 我已经习惯了这样做,,....但我要开始对其进行命名 问题答案: 有很多方法可以解析sh中的参数。Getopt很好。这是一个简单的脚本,可以手动解析内容: 运行示例如下: 请注意,由于脚本eval是由用户构造的字符串,因此它甚至不具有强大的鲁棒性,也没有向安全漏洞开放。它仅是作为一种可能的做事方式的示例。一种更简单的方法是要求用户在环境中传递数据。在bourne

  • 问题内容: 关于这种事情有很多问题,但让我们想象一下,我们的目标是安装了getopt和getopts的通用Linux系统(不是我们将使用其中任何一种,但它们似乎很流行) 如何同时解析长参数(–example | –example简单选项)和短参数(-e | -esimple-example | -e简单示例) 问题答案: 您想使用多头和空头期权。工作代码示例: 注意,是先前定义的功能(未显示)。

  • 问题内容: 我试图解析WMIC的输出,然后获取PID。 我的脚本如下: 输出如下: 我的目标是获取进程ID。 我已经尝试过将空间作为FOR循环中的delims。然而没有运气。 所以我的问题是如何格式化WMIC的列并获取列? 问题答案: WMIC使用SQL语法的子集。通过将LIKE运算符与通配符一起使用,可以在功能上将FINDSTR测试放在WMIC WHERE子句中。由于它在批处理脚本中,因此需要加

  • 问题内容: 在shell中,我有一个要求,我必须读取以下格式的JSON响应: 在这里,我只关心“ Body”属性值。我做了一些不成功的尝试,例如: 要么 但这还不够。谁能帮我这个? 问题答案: 在命令行上有用于解析json的代码: 访问此以获得jq:https://stedolan.github.io/jq/

  • 问题内容: 我正在使用Weather Underground API制作应用程序,但在解析与严重警报有关的代码块时遇到了麻烦。JSON使用具有子键值对的键值对- 这对我来说不是问题,因为我可以从中选出后续的NSDictionary-但严重警报的条目被证明是有问题的。见下文: “警报”对与我已经解析的其他对有所不同,因为它在子值周围有这个 []括号 ,而且我不确定如何清除它,以便可以访问子值。在我能

  • 我正在尝试使用jQuery将此对象转换为数组 我试图得到这样的数组输出: 怎样?