[英]Bash script to extract all specific key values from a unstructured JSON file
我试图从以下 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
需要修复什么才能实现这一点?
当你运行:
echo new.json | jq '.tags[] | .["image_id"]'
...字符串new.json
- 不是名为new.json
的文件的内容 - 被送到jq
的stdin,因此它试图解析为JSON文本。
jq -r '.tags[] | .["image_id"]' <new.json
...直接打开连接到jq
的stdin的new.json
(和-r
,以避免在输出流中添加不需要的引号)。
此外,您可能想尝试一种替代方法来使用JSON: jtc
的walk-path unix工具。 有了那个你的问题看起来像这样:
bash $ <new.json jtc -w'[tags][:][image_id]'
"yyy1"
"yyy2"
bash $
但是,你的new.json
不是非结构化的,相反它的结构很好。 如果你的new.json确实是不规则的(非结构化),那么以下查询将更好地工作:
bash $ <new.json jtc -w'<image_id>l:'
"yyy1"
"yyy2"
bash $
.tags[] | .["image_id"]
.tags[] | .["image_id"]
是有效的,但可以缩写为:
.tags[] | .image_id
甚至:
.tags[].image_id
如果您想要与“image_id”键关联的值,无论该键出现在何处,您都可以使用:
.. | objects | select(has("image_id")) | .image_id
或者,如果您不介意丢弃false和null值:
.. | .image_id? // empty
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.