在正确的部分添加JSON值

在正确的部分添加JSON值,json,shell,jq,Json,Shell,Jq,我的json文件“vegies.json”如下所示: {"plants": {"veggies": [ {"section":"TUBERS", "values": [ {"tuber":"potato","type":"stem"} ] }, {"section":"LEGUMES", "values": [

我的json文件“vegies.json”如下所示:

{"plants":
  {"veggies":
    [
      {"section":"TUBERS",
        "values":
          [
            {"tuber":"potato","type":"stem"}
          ]
      },
      {"section":"LEGUMES",
        "values":
          [
            {"legume":"beans"},
            {"legume":"peanuts"}
          ]
      }
    ]
  }
}
我想添加另一个块茎“yam”,它是“根”类型-这必须在块茎部分下

我刚开始使用JSON,我已经用各种jq命令打破了我的头脑,但是没有太大的用处

我尝试使用以下命令读取值[0]处的值,但似乎无法列出任何内容:

jq -r "[.[] | select(.plants.veggies.section == \"TUBERS\") | .plants.veggies.values.tuber]" veggies.json
从本质上说,我试图做到这一点-如果植物部分是块茎,添加块茎“yam”,这是“根”类型

谁能帮帮我吗

哦,如果这很重要的话,我还是坚持使用jq版本1.2(向后兼容性等等)


提前非常感谢。

没关系-在更多的头部开裂之后,我想我得到了:

cat veggies.json | jq '.plants.veggies[] | select(.section == "TUBERS") | .values |= . + [{ "type": "root", "tuber": "yam" }]'
这似乎是我想要的:

{
  "values": [
    {
      "type": "stem",
      "tuber": "potato"
    },
    {
      "tuber": "yam",
      "type": "root"
    }
  ],
  "section": "TUBERS"
}
如果有人能进一步优化,我也会非常渴望了解这一点。

试试这个:

jq '(.plants.veggies[] | select(.section == "TUBERS") | .values) |= . + [{"type": "root", "tuber": "yam"}]' veggies.json
这将运行一个子过滤器:选择veggies数组的元素,查找具有匹配部分的元素,并生成值varray。然后将对象附加到值数组

这与您自己答案中的过滤器基本相同,但有一个关键区别:因为您实际上没有从主输入数据中过滤任何内容,所以它将打印出整个JSON文档(而不仅仅是修改的部分)。我不确定这对您是否有好处,但它使在脚本中修改整个文档变得非常容易


(在jq 1.3上测试)

查看手册中的部分,它向您展示了具体的操作方法。哇-您是对的-您的打印出了整个文档,而我的打印出了我修改过的部分-以及我的代码的功能-这不太好。我确实需要整个文件。非常感谢您的澄清。你有没有资源/链接可以让我学习这类东西(我写的代码显然是在对发生的事情了解很少的情况下编写的)这个功能在文档的一节中解释(一直到最后)。在我看来,这不是最清楚的,这就是它所展示的,但这就是我学会如何做到的地方。请参见该页上的最后一个示例。(如果您觉得答案已解决,请不要忘记在该答案旁边标记复选框问题:D)嘿@0x783czar-我注意到,如果我多次执行同一命令,代码将被添加多次。是否有任何方法可以将“ifexists,edit,else add”例程添加到此逻辑中?一个小小的简化:您可以在此处编写“+=”而不是“|=。+”。