我有這樣的檔案(確切格式):
{ "test": "10" }
{ "games": "30" }
{ "REPOSITORY": "5"}
我想更新鍵的值。例如游戲到 66。所以新檔案將是:
{ "test": "10" }
{ "games": "66" }
{ "REPOSITORY":"5"}
我將 jq 與臨時檔案組合使用
tmp=$(mktemp);
jq '.games = "66"' pair.json > "$tmp" && mv "$tmp" change.json
但得到了這種輸出。
{
"test": "10",
"games": "66"
}
{
"games": "66"
}
{
"REPOSITORY": "5",
"games": "66"
}
其中游戲是全部 3 寫的,而我只希望它只在其位置更新。此外,我希望使用 bash 變數更新該值,但在解決此問題后,我可以嘗試使用 --arg 來計算。請在這里提供幫助。
uj5u.com熱心網友回復:
您的輸入是物件流。因此,您的過濾器運算式.games = "66"斷言記錄games存在于流中存在的每個物件中。
要單獨更新特定物件,請先選擇它并分配所需的值或更新它。
jq -c 'select(has("games")).games = "66"'
要回答 OP 關于如何對變數執行相同操作的說明,請執行
jq -c --arg key "games" 'select(has($key))[$key] = "555"'
uj5u.com熱心網友回復:
一個簡單的解決方案是使用selectwith assignment。empty如果條件不匹配,select 將回傳特殊值,如果匹配則回傳輸入值。
select(.games).games = "66"
jq -c生成緊湊格式,即每行一個 JSON 物件/檔案。
要處理任意名稱,請稍微更改語法:
select(.["games"])["games"] = "66"
并與通過 CLI 傳遞的引數一起使用:
jq -r --arg key "$var" 'select(.[$key])[$key] = "66"'
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512829.html
標籤:重击壳jq
