我正在尝试编写一个脚本,对json对象数组进行一些处理。源json的简化版本看起来像这样。请注意第二个对象中的转义双引号。
[
{
"id": "1a-2b",
"name": "my job name",
"description": "my job description"
},
{
"id": "3c-4d",
"name": "my \"quoted\" job name",
"description": "my \"quoted\" job description"
}
]
我的脚本目前尝试使用我在搜索中的其他位置找到的“while read”惯用法来迭代源代码。
while read job; do
# fetch individual values into variables
jobname=`echo $job | jq -r '.name'`
# do processing on the individual values
echo $jobname
done < <(cat jobs | jq -c '.[]')
问题似乎是转义的引号在紧凑的输出中转义为$ job变量。因此,当我在循环中使用jq重新处理单个对象时,我会在每个具有引用值的对象上获得jq解析错误。
我目前正在使用jq 1.4,而且我一直在尝试tojson / fromjson / @ sh / tostring的各种组合,但还没找到合适的组合。我不反对转移到jq 1.5,如果它有一个功能,将使这更容易。如果有更聪明的方法可以做我正在尝试的事情,我也没有与“同时阅读”成语结婚。
答案 0 :(得分:4)
不是在每个数组元素上再次调用jq
,而只需使用第一个为循环提供的调用来获取名称。
while read -r job; do
echo "$job"
done < <(jq -c '.[].name' < jobs)
(并按照Etan的建议使用read -r
。
如果您需要多个变量,请尝试(例如)
while read -r id
read -r job; do
echo "$id: $job"
done < <(jq -c '.[]|.id,.name' < jobs)
答案 1 :(得分:1)
这可以在一行中完成
要查看,json文件内容(文件名是作业):
[
{
"id": "1a-2b",
"name": "my job name",
"description": "my job description"
},
{
"id": "3c-4d",
"name": "my \"quoted\" job name",
"description": "my \"quoted\" job description"
}
]
jq one liner jq '.[] | (.name)' jobs
输出:
"my job name"
"my \"quoted\" job name"