如何使用jq删除数组元素?

38

我正在尝试使用jq从一些JSON中删除一个数组元素。以下是输入和期望的输出。

jq .Array[0] 

输出我想要的数组元素。

{
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    }

但是我该如何重新包装它呢:

{
  "blah0": "zeroblah",
  "Array": [

  ]
}

输入:

{
  "blah0": "zeroblah",
  "Array": [
    {
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    },
    {
      "blah2": [
        "key2:val2"
      ],
      "foobar2": "barfoo2",
      "foobar3": "barfoo3"
    }
  ]
}

期望输出:

{
  "blah0": "zeroblah",
  "Array": [
    {
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    }
  ]
}

您想仅删除Array[1]还是删除第一个元素之后的所有Array元素,即如果Array有两个以上的元素,则输出应该是什么? - jwodder
在这种情况下,只有两个数组元素,我想删除第二个元素。但更普遍地说,我试图理解jq如何允许选择性的数组元素控制。也许下一次我想要删除数组元素1、3、5和11。 - Paul Ericson
2个回答

58

关于Paul Ericson提问的第二部分:

但更一般地说,我想了解jq如何允许选择性地控制数组元素。也许下一次我想要删除数组元素1、3、5和11。

要删除元素1、3、5和11,只需使用:

del(
    .Array[1,3,5,11]
)

但通常情况下,您可以使用更复杂的过滤器作为del的参数。例如,此过滤器会删除.Array中其.foobar2键为"barfoo2"的元素:

del(
    .Array[]
  | select(.foobar2 == "barfoo2")
)
在这个例子中生产
{
  "blah0": "zeroblah",
  "Array": [
    {
      "blah1": [
        "key1:val1"
      ],
      "foobar0": "barfoo0",
      "foobar1": "barfoo1"
    }
  ]
}

如果有人想知道如何在顶级数组中执行相同操作,命令看起来会像这样: del(.[] | select(.key == "value")) - Andrew Tatomyr

19

在这种特殊情况下,最简单的方法是:

del(.Array[1])

更一般地,如果你想要删除数组中除第一个以外的所有项:

.Array |= [.[0]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接