簡體   English   中英

用於從非結構化 JSON 文件中提取所有特定鍵值的 Bash 腳本

[英]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 $ 
  1. 你的過濾器.tags[] | .["image_id"] .tags[] | .["image_id"]

是有效的,但可以縮寫為:

.tags[] | .image_id

甚至:

.tags[].image_id
  1. 如果您想要與“image_id”鍵關聯的值,無論該鍵出現在何處,您都可以使用:

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

或者,如果您不介意丟棄false和null值:

.. | .image_id? // empty

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM