Bash
jq如何將文件中的對象添加到文件中的數組中
我在一個數組中有一個包含以下內容的文件。我
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_FILE2
到FAVORITE_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"
這會擴展第一個文件中的數組,然後以此創建一個新數組,其中第二個文件中的對像作為最後一個元素。
你也可以使用
--slurp
or-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