gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:50:08 24 4
gpt4 key购买 nike

我正在尝试将 shell 脚本中的 JSON 对象解析为数组。

例如:[阿曼达,25 岁​​,http://mywebsite.com]

JSON 看起来像:

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

我不想使用任何库,如果我能使用正则表达式或 grep 会更好。我做了:

myfile.json | grep name

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

最佳答案

如果您真的不能使用合适的 JSON 解析器,例如 jq [1], 试试 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,它支持 \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 -based 解决方案 看起来像(Bash 4.x):
readarray -t values < <(jq -r '.[]' myfile.json)

关于json - 将 JSON 解析为 shell 脚本中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38364261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com