[英]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.