Bash

jq如何將文件中的對象添加到文件中的數組中

  • July 3, 2021

我在一個數組中有一個包含以下內容的文件。我FAVORITE_FULL在我的 Bash 腳本中呼叫它。

[
   {
       "name": "__SOLOPIANO__ by rautemusik (rm.fm)",
       "url_resolved":"https://rautemusik-de-hz-fal-stream14.radiohost.de/solopiano?ref=radiobrowser&listenerid=31363235323832333936-326130333a343030303a33373a34323a633466653a346366663a666561373a38393431-3533343132-53747265616d436865636b426f742f302e312e30",
       "favicon": "https://i.ibb.co/48KRX7M/solopiano.jpg",
       "tags": "ambient,jazz,smooth lounge,smooth,smooth jazz",
       "countrycode": "DE",
       "language": "english,deutsch german,deutsch,german"
   },
   {
       "name": "- 0 N - Smooth Jazz",
       "url_resolved":"http://0n-jazz.radionetz.de/0n-jazz.aac",
       "favicon": "http://www.0nradio.com/images/favicon/mstile-144x144.png",
       "tags": "ambient,jazz,smooth lounge,smooth,smooth jazz",
       "countrycode": "DE",
       "language": "german"
   },
   ...
]

在此過程中,我在文件中創建了一個 JSON。我TEMP_FILE2在我的腳本中呼叫它。

{
       "name": ".977 Smooth Jazz",
       "url_resolved":"http://19353.live.streamtheworld.com:3690/977_SMOOJAZZ_SC",
       "favicon": "http://977music.com/images/logo.gif",
       "tags": "jazz,smooth jazz",
       "countrycode": "US",
       "language": "english"
   }

現在我想添加TEMP_FILE2FAVORITE_FULL. 我根據這個執行緒嘗試了以下操作。

jq '.[] += ["$TEMP_FILE2"]' "$FAVORITE_FULL" "$TEMP_FILE2"

這將返回以下錯誤。

jq: error (at /Users/shinichiokada/.tera/favorite.json:33): object ({"name":"__...) and array (["$TEMP_FIL...) cannot be added
jq: error (at /tmp/tera_favorite2.json:1): Cannot iterate over null (null)
jq --argjson TEMP "$(cat "$TEMP_FILE2")" '.[] += [$TEMP]' "$FAVORITE_FULL"

這將返回以下錯誤。

jq: error (at /Users/shinichiokada/.tera/favorite.json:33): object ({"name":"__...) and array ([{"changeuu...) cannot be added

如何將文件中的 JSON 添加到另一個文件中的數組中?

jq '. += [input]' "$FAVORITE_FULL" "$TEMP_FILE2"

這會將第二個文件中的對象添加到第一個文件的[input]數組中,方法是使用+=. 該input函式讀取下一個輸入文件,我們在這裡使用它來將 的內容讀$TEMP_FILE2入一個數組,該數組被添加到數組中$FAVORITE_FULL(一個對像不能按原樣添加到帶有 的數組中+=,它需要放入首先進入自己的數組)。

或者,

jq '[ .[], input ]' "$FAVORITE_FULL" "$TEMP_FILE2"

這會擴展第一個文件中的數組,然後以此創建一個新數組,其中第二個文件中的對像作為最後一個元素。

你也可以使用--slurpor -s

jq -s '.[0] += [.[1]] | .[0]' "$FAVORITE_FULL" "$TEMP_FILE2"

這會將所有輸入文件讀入一個數組,其中包含第一個文件的數組.[0]和要添加的對象.[1]。然後,我們使用為新對象創建一個數組[.[1]] 並將其添加到數組中。最後我們輸出更新後的.[0]數組。

具有與上述替代解決方案相同的變化:

jq -s '[ .[0][], .[1] ]' "$FAVORITE_FULL" "$TEMP_FILE2"

我還注意到,您的嘗試--argjson只需稍作調整即可:

jq --argjson t "$(cat "$TEMP_FILE2")" '. += [$t]' "$FAVORITE_FULL"

注意.(一個數組)代替你的.[](一組對象,一個擴展數組)。

或者,使用--slurpfile

jq --slurpfile t "$TEMP_FILE2" '. += $t' "$FAVORITE_FULL"

注意$t而不是[$t]這裡。當我們使用 slurp 模式時,被 slurp 的數據總是放入一個數組中,最後一個範例中$t包含單個對象的數組也是如此。$TEMP_FILE2

引用自:https://unix.stackexchange.com/questions/656895