我正在尝试使用bash
解析大json文件//part of json file
{"name": "Jenkins", "version": "Jenkins-2.22"},
{"name": "FitNesse", "version": "FitNesse-2.1"},
{"name": "Quint","version": "Quint-2.12"},
{"name": "Otto","version": "Otto-1.0"},
{"name": "Gradle","version": "Gradle-1.1"}
我能够从json文件中读取匹配'version'的行
while read line; do
if [[ $line =~ "version" ]] ; then
echo $line; fi
done < $manifestfile
我想在我的while循环中将值[Jenkins-2.22,FitNesse-2.1,Quint-2.12,Otto-1.0,Gradle-1.1]存储在数组中
需要帮助调整上面的代码
答案 0 :(得分:3)
假设上面的示例输入位于文件file.json
中的JSON 数组内,即:
[
{"name": "Jenkins", "version": "Jenkins-2.22"},
{"name": "FitNesse", "version": "FitNesse-2.1"},
{"name": "Quint","version": "Quint-2.12"},
{"name": "Otto","version": "Otto-1.0"},
{"name": "Gradle","version": "Gradle-1.1"}
]
注意:使以下命令在 Bash 3.x 中运行所需的唯一更改是将readarray -t versions
替换为IFS=$'\n' read -d '' -ra versions
< / p>
jq
: jq
,但如果可行,这非常值得:启用复杂,强大的JSON解析。
# Extract the version numbers and read them into a Bash array.
readarray -t versions < <(jq -r '.[].version' file.json)
# Print the array.
printf '%s\n' "${versions[@]}"
以上产量:
Jenkins-2.22
FitNesse-2.1
Quint-2.12
Otto-1.0
Gradle-1.1
awk
:如果您无法安装jq
,则可以选择使用以下awk
解决方案,但请注意强度要低得多,并且依赖于JSON的格式与上面完全相同。
此警告适用于使用标准实用程序的任何解决方案(awk
,grep
,sed
,...) - 只有专用的JSON解析器才能生效鲁棒 强>
readarray -t versions < <(awk -F\" 'NF>1 { print $(NF-1) }' file.json)
# Print the array.
printf '%s\n' "${versions[@]}"
答案 1 :(得分:2)
sed -n 's/.*"\([^"]*\)"}.*/\1/p' <file>
答案 2 :(得分:1)
jq是在Unix shell中操作JSON数据的合适工具。
假设test.json
文件包含:
[
{"name": "Jenkins", "version": "Jenkins-2.22"},
{"name": "FitNesse", "version": "FitNesse-2.1"},
{"name": "Quint","version": "Quint-2.12"},
{"name": "Otto","version": "Otto-1.0"},
{"name": "Gradle","version": "Gradle-1.1"}
]
test_json.sh 脚本(简化版):
#!/bin/bash
versions=$(jq '.[] | .version' test.json)
versions_arr=($versions) # contains an array of `version` key values
我必须 警告 上述方法($versions)
(在字符串拆分时创建数组)可能 失败 < / strong>如果字符串$versions
中包含 globbing 字符。
更“稳定”的方法是使用带有read
选项的内置-a
命令将数据逐字地读入指定的数组:
test_json.sh 脚本(“稳定版”):
#!/bin/bash
versions=$(jq '.[] | .version' test.json)
read -a versions_arr <<< $versions # read `version` key values into array
现在,versions_arr
是version
个键值的数组
要打印例如你要做的第二个数组值:
echo ${versions_arr[1]}
输出:
"FitNesse-2.1"
答案 3 :(得分:0)
使用JQ轻松解析Json,只需安装JQ,然后使用:
如果您有一个json数组,并且在每个元素中都有字段版本,您可以使用:
cat myJsonFile | jq '.[].version'
这将返回版本列表
如果您想逐行处理
while read line; do
if [[ $line =~ "version" ]] ; then
echo $line | jq .[] | jq ."version" ; fi
done < $manifestfile