[
{
"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
状态的条目:映射
select(.status == "off")
将通过仅提取(选择).status == "off"
为true的元素来更改数组。从上面仅提取解码的名称:
在前
[].name
一个表达式的末尾添加将首先将数组扩展为一组单独的条目(就是这样[]
做的),然后.name
从每个条目中提取值。你也可以使用
...创建一个名称数组,然后从中提取所有元素。
on
为所有具有状态的条目设置off
状态:通过映射,我们通过将状态设置为状态为的任何元素
select(.status == "off").status = "on"
来修改我们的数组。on
off
on
根据显式名称为条目设置状态:同样的事情,但不要对表达式中的名称进行硬编码。相反,将它们作为一个列表放在命令行的末尾(请注意,
--args
名称列表必须是命令行中的最后一件事):--args
在名为 的数组中可以找到给定的名称列表$ARGS.positional
。如果出现在 set 中,则
IN(a; b)
事物返回true。我们使用作为搜索的集合,它是命令行上给出的名称集合。这意味着我们的此处将仅提取名称出现在命令行列表中的元素,并且这些元素的状态将设置为。a
b
$ARGS.positional[]
select()
on
请注意,它
IN(a; b)
与类似命名的 不同,如果给定值作为对象或数组中的键或索引出现in(a)
,则返回truea
。将所有条目的状态设置为
on
:评论中的后续问题:
以下使用显式
if
语句将状态更改on
为给定名称和off
所有其他名称:或者,在单行布局中:
如果我将后续操作解释为不想更改给定名称的状态,无论它们的状态是什么,而是将所有其他状态更改为
off
. 在这种情况下,我们可以否定先前变体中使用的条件:注意后面加
| not
的IN(...; ...)
。当然,您也可以
if
在上述大多数变体中使用语句,但我喜欢在可能的情况下使用select()
。