json - 使用 jq 和引用值处理 json 数组

标签 json linux bash jq

我正在尝试编写一个脚本,对一组 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。如果有更聪明的方法来做我想做的事情,我也不会与“边读边读”的习语结婚。

最佳答案

无需在每个数组元素上再次调用 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 - 使用 jq 和引用值处理 json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125603/

相关文章:

json - 如何仅显示不是 jq 1.3 版数组或对象的顶级 JSON 条目?

python - subprocess.Popen 的平台独立示例

linux - 在一个文件中搜索给定模式的另一个文件

regex - 删除除 () 包围之外的所有内容

linux - 如何将可配置的分钟添加到包含当前时间的变量中

javascript - 添加到 Jquery EasyUI 树的链接(带有 json 数据)

java - 如何在 Spring Boot Rest 中正确发布 json 对象

linux - 尝试使用 grep 进行过滤

javascript - 为什么我无法使用 JSON.parse() 解析此 JSON 字符串

Perl 一行提取多行模式