我知道这很简单,但是由于某种原因,我不知道如何找到一个给定条件的元素并修改它的一个字段。
{
"state": "wait",
"steps": {
"step1": [
{ "name":"Foo", "state":"wait" },
{ "name":"Bar", "state":"wait" }
],
"step2": [
{ "name":"Foo", "state":"wait" },
{ "name":"Zoinks", "state":"ready" }
],
"step3": [
{ "name":"Foo", "state":"cancel" }
]
}
}
字符串
我希望这样的东西应该是可行的。jq '. | (select(.steps[][].name=="Foo" and .steps[][].state=="wait") |= . + {.state:"Ready"}'
个
或jq '. | (select(.steps[][]) | if (.name=="Foo" and .state=="wait") then (.state="Ready") else . end)
个
当然,所需的输出将是
{
"state": "wait",
"steps": {
"step1": [
{ "name":"Foo", "state":"ready" },
{ "name":"Bar", "state":"wait" }
],
"step2": [
{ "name":"Foo", "state":"ready" },
{ "name":"Zoinks", "state":"ready" }
],
"step3": [
{ "name":"Foo", "state":"cancel" }
]
}
}
型
相反,当我没有得到隐含错误时,我要么修改文档中的顶级字段,要么修改 * 所有 * 元素的字段,要么多次重复整个文档。
任何见解不胜感激。
谢谢.
p.s.有没有比[]更好的语法来通配符步骤下面的命名元素?或者在管道后面来标识select所发现的索引?
2条答案
按热度按时间pgccezyw1#
将
.steps[][]
的输出导入select
调用,该调用选择具有所需name
和state
值的对象,然后在结果上设置state
值。字符串
您可以使用
diff
来确认这一点(第一个jq
只是规范化格式,因此只有第二个jq
所做的更改才会显示在diff中):型
mbskvtky2#
对于一个复杂的文档,
个字符
导致
型