[英]Modify Nested JSON with jq
我正在嘗試使用bash / shell腳本中的jq <map>
函數修改嵌套的JSON對象; 類似於此博客條目,但嘗試將此處的示例改編為嵌套對象。
返回的JSON如下修改:
{
"name": "vendor-module",
"dependencies": {
"abc": {
"from": "abc@2.4.0",
"resolved": "https://some.special.url",
"version": "2.4.0"
},
"acme": {
"from": "acme@1.2.3",
"resolved": "<CHANGE_THIS>",
"version": "1.2.3"
}
}
}
這是我的嘗試:
modules="`node -pe 'JSON.parse(process.argv[1]).dependencies.$dependency' \
"$(cat $wrapped)"`"
version="1.2.3"
resolved="some_url"
cat OLD.json |
jq 'to_entries |
map(if .dependencies[0].$module[0].from == "$module@$version"
then . + {"resolved"}={"$resolved"}
else .
end
) |
from_entries' > NEW.json
顯然,這是行不通的。 當我運行腳本時,將創建NEW.json
,但是沒有修改或返回錯誤。 如果我的目標不是嵌套對象(例如"name": "vendor-module"
),則腳本將按預期工作。 我敢肯定有一種方法可以使用本地bash和jq來實現。 任何幫助(帶有適當的轉義)將不勝感激。
更新:
在Charles Duffy的答案的幫助下以及他使用sponge
建議下,Thnx對我來說很有效的解決方案是:
jq --arg mod "acme" --arg resolved "Some URL" \
'.dependencies[$mod].resolved |= $resolved' \
OLD.json | sponge OLD.json
如果知道要更新的依賴項的名稱,則可以將其索引。
$ jq --arg dep "$dep" --arg resolved "$resolved" \
'.dependencies[$dep].resolved = $resolved' \
OLD.json > NEW.json
否則,要基於名稱(或其他屬性)修改依賴項,請搜索該依賴項並進行更新。
$ jq --arg version "$version" --arg resolved "$resolved" \
'(.dependencies[] | select(.version == $version)).resolved = $resolved' \
OLD.json > NEW.json
對於您現有的樣本數據,滿足以下條件:
jq --arg mod "acme" \
--arg resolved "some_url" \
'.dependencies[$mod].resolved=$resolved' \
<in.json >out.json
...來過濾from
,相反:
jq --arg new_url "http://new.url/" \
--arg target "acme@1.2.3" \
'.dependencies=(.dependencies
| to_entries
| map(if(.value.from == $target)
then .value.resolved=$new_url
else . end)
| from_entries)' \
<in.json >out.json
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.