如何使用 jq 檢查值並更改 JSON 中的其他鍵?
[ { "name": "user1", "status": "off" }, { "name": "user2", "status": "off" }, { "name": "user3", "status": "on" } ]
我想知道如何遞歸地在 JSON 文件中搜尋 的值
status
,例如,off
並獲取name
狀態為 的所有值off
。另外,如何更改 和
user1
的user2
值on
?我正在使用
jq
和bash
。
要將表達式應用於數組的所有元素,並獲取更改後的數組,請使用
map(expression)
.提取所有具有
off
狀態的條目:$ jq 'map(select(.status == "off"))' file [ { "name": "user1", "status": "off" }, { "name": "user2", "status": "off" } ]
映射
select(.status == "off")
將通過僅提取(選擇).status == "off"
為true的元素來更改數組。從上面僅提取解碼的名稱:
$ jq -r 'map(select(.status == "off"))[].name' file user1 user2
在前
[].name
一個表達式的末尾添加將首先將數組擴展為一組單獨的條目(就是這樣[]
做的),然後.name
從每個條目中提取值。你也可以使用
jq -r 'map(select(.status == "off").name)[]' file
…創建一個名稱數組,然後從中提取所有元素。
on
為所有具有狀態的條目設置off
狀態:$ jq 'map(select(.status == "off").status = "on")' file [ { "name": "user1", "status": "on" }, { "name": "user2", "status": "on" }, { "name": "user3", "status": "on" } ]
通過映射,我們通過將狀態設置為狀態為的任何元素
select(.status == "off").status = "on"
來修改我們的數組。on``off
on
根據顯式名稱為條目設置狀態:$ jq 'map(select(.name == "user1" or .name == "user2").status = "on")' file [ { "name": "user1", "status": "on" }, { "name": "user2", "status": "on" }, { "name": "user3", "status": "on" } ]
同樣的事情,但不要對錶達式中的名稱進行硬編碼。相反,將它們作為一個列表放在命令行的末尾(請注意,
--args
名稱列表必須是命令行中的最後一件事):$ jq 'map(select(IN(.name; $ARGS.positional[])).status = "on")' file --args user1 user2 [ { "name": "user1", "status": "on" }, { "name": "user2", "status": "on" }, { "name": "user3", "status": "on" } ]
--args
在名為 的數組中可以找到給定的名稱列表$ARGS.positional
。如果出現在 set 中,則
IN(a; b)
事物返回true。我們使用作為搜尋的集合,它是命令行上給出的名稱集合。這意味著我們的此處將僅提取名稱出現在命令行列表中的元素,並且這些元素的狀態將設置為。a``b``$ARGS.positional[]``select()``on
請注意,它
IN(a; b)
與類似命名的 不同,如果給定值作為對像或數組中的鍵或索引出現in(a)
,則返回truea
。將所有條目的狀態設置為
on
:$ jq 'map(.status = "on")' file [ { "name": "user1", "status": "on" }, { "name": "user2", "status": "on" }, { "name": "user3", "status": "on" } ]