使用 jq 和引用值处理 json 数组
Processing json array with jq and quoted values
我正在尝试编写一个脚本,对 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 具有使这更容易的功能,我不反对迁移到 jq 1.5。如果有更聪明的方法来做我想做的事情,我也不会嫁给 'while read' 习语。
无需在每个数组元素上再次调用 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)
这可以在一行中完成
查看,json文件内容(文件名为jobs):
[
{
"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一班jq '.[] | (.name)' jobs
并且输出:
"my job name"
"my \"quoted\" job name"
我正在尝试编写一个脚本,对 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 具有使这更容易的功能,我不反对迁移到 jq 1.5。如果有更聪明的方法来做我想做的事情,我也不会嫁给 'while read' 习语。
无需在每个数组元素上再次调用 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)
这可以在一行中完成
查看,json文件内容(文件名为jobs):
[
{
"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一班jq '.[] | (.name)' jobs
并且输出:
"my job name"
"my \"quoted\" job name"