![](/img/trans.png)
[英]How to replace values in a JSON dictionary with their respective shell variables in jq?
[英]How to filter and replace values in json with jq
我在使用 jq 過濾和更新 json 文件的內容時遇到問題。 我需要根據特定值過濾 json 數據,並基於該過濾器編輯其他值並增加其他值
我試過用
jq '.[] | select (."name"| contains("CHANNEL1"))'
過濾但結果缺少頂部鍵“x-ID.0”信息,結果如下:
{
"_file.name": "filename.ext",
"name": "CHANNEL1 HD TV",
"logo": "file.png",
"x-channelID": "726"
}
{
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 SD",
"logo": "file.png",
"x-channelID": "726"
}
為了重新編號,我已經測試了下面的 function 並且效果很好
jq -n -s '[ foreach inputs[] as $i (100; .+1; $i*{"x-channelID":(.-1)}) ]'
這是原始的 json 文件
{
"x-ID.0": {
"_file.name": "filename.ext",
"name": "CHANNEL1 HD TV",
"logo": "file.png",
"x-channelID": "726"
},
"x-ID.2": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL2",
"logo": "file.png",
"x-channelID": "106"
},
"x-ID.3": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL3 SD",
"logo": "file.png",
"x-channelID": "236"
},
"x-ID.4": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 SD",
"logo": "file.png",
"x-channelID": "726"
},
"x-ID.5": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL2 HD",
"logo": "file.png",
"x-channelID": "726"
}
}
這是預期的結果
{
"x-ID.0": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 HD",
"logo": "CHANNEL1.png",
"x-channelID": "100"
},
"x-ID.4": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 SD",
"logo": "CHANNEL1.png",
"x-channelID": "101"
}
}
謝謝你的幫助 !
您可以使用以下內容:
to_entries | map(select(.value.name|strings|contains("CHANNEL1"))) | [foreach .[] as $keyvalue (99; .+1; { key: $keyvalue.key, value: ($keyvalue.value + {"x-channelID": .})})] | from_entries
to_entries
map 將您的 object 放入{ key: "key", value: "value" }
項的數組中。
map(select(filter))
過濾那些值符合您的條件的人。
然后,我們使用foreach
來增加一個計數器,同時迭代剩余的鍵/值對,並用計數器更新值的 x-channelID 字段。
最后,我們使用from_entries
從鍵/值對數組中重新創建所需的 object。
你可以在這里試試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.