【问题标题】:Bash script to extract all specific key values from a unstructured JSON file用于从非结构化 JSON 文件中提取所有特定键值的 Bash 脚本
【发布时间】:2019-04-25 01:37:41
【问题描述】:

我试图从以下 JSON 文件中的特定键中提取所有值。

{
  "tags": [
    {
      "name": "xxx1",
      "image_id": "yyy1"
    },
    {
      "name": "xxx2",
      "image_id": "yyy2"
    }
  ]
}

我使用下面的代码来获取 image_id 键值。

echo new.json | jq '.tags[] | .["image_id"]'

我收到以下错误消息。

parse error: Invalid literal at line 2, column 0

我认为要么 JSON 文件格式不正确,要么调用 Json 文件的 echo 命令错误。

鉴于上述输入,我的预期/期望输出是:

yyy1
yyy2

需要解决什么问题才能做到这一点?

【问题讨论】:

  • 是的,使用cat 而不是echo
  • 在对整行或更多行进行代码格式化时,在自己的行上使用 triple 反引号,而不是单个反引号。您不会使用单个反引号获得代码格式或修改的背景颜色(超出写入实际文本的窗口区域)。
  • 也就是说,也不要使用catjq '.tags[] | .["image_id"]' <new.json 是正确的。不必要地使用cat sometimes 几乎是无害的(老实说,这是其中之一),但是当你运行的命令是tail 时,养成这个习惯会让你很难受, shuf,或者其他在给定不可搜索的 FD 时效率极低的东西。
  • 顺便说一句,在尝试匿名化内容以构建 minimal reproducible example 时,请确保它在语法上仍然足够有效以符合“可验证”标准。当您将数字更改为不带引号的xxx 时,您的输入不再是有效的 JSON,从而使复制器不再是无需更改即可运行的东西。

标签: json bash jq


【解决方案1】:

当你运行时:

echo new.json | jq '.tags[] | .["image_id"]'

...字符串 new.json -- 不是 名为 new.json 的文件的内容 -- 被馈送到 jq 的标准输入,因此它试图解析作为 JSON 文本。

Instead, run:

jq -r '.tags[] | .["image_id"]' <new.json

...直接打开连接到jq 的标准输入的new.json(并且,使用-r,以避免在输出流中添加不需要的引号)。

【讨论】:

    【解决方案2】:
    1. 你的过滤器.tags[] | .["image_id"]

    有效,但可以简写为:

    .tags[] | .image_id
    

    甚至:

    .tags[].image_id
    
    1. 如果您想要与“image_id”键关联的值,无论该键出现在哪里,您都可以使用:

      .. | objects | select(has("image_id")) | .image_id

    或者,如果您不介意丢弃 false 和 null 值:

    .. | .image_id? // empty
    

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 2014-07-31
      • 2019-10-01
      • 1970-01-01
      • 2012-01-06
      • 2021-11-29
      • 2021-03-20
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多