Bash

如何使用 jq 檢查值並更改 JSON 中的其他鍵?

  • October 1, 2022
[
   {
       "name": "user1",
       "status": "off"
   },
   {
       "name": "user2",
       "status": "off"
   },
   {
       "name": "user3",
       "status": "on"
   }
]

我想知道如何遞歸地在 JSON 文件中搜尋 的值status,例如,off並獲取name狀態為 的所有值off

另外,如何更改 和user1user2on

我正在使用jqbash

要將表達式應用於數組的所有元素,並獲取更改後的數組,請使用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"
 }
]

引用自:https://unix.stackexchange.com/questions/719310