使用shell脚本在特定数组索引后追加JSON文件

gj3fmq9x  于 2023-02-17  发布在  Shell
关注(0)|答案(2)|浏览(168)

我想使用shell脚本添加一些内容。我有一个JSON文件 test.json 如下。

{
  "reference": "Json Test",
  "title": {
    "a": "Json Test"
  },
  "components": [
    {
      "reference": "Json Test",
      "type": "panel",
      "content": [
        {
          "link": "abc/123",
          "label": {
            "a": "for test 123 - a",
            "b": "for test 123 - b"
          }
        },
        {
          "link": "abc/456",
          "label": {
            "a": "for test 456 - a",
            "b": "for test 456 - b"
          }
        },
        {
          "link": "abc/789",
          "label": {
            "a": "for test 789 - a",
            "b": "for test 789 - b"
          }
        }
      ]
    }
  ]
}

我想使用shell脚本(*.sh)添加内容和输出,如下所示。如何实现?

{
  "reference": "Json Test",
  "title": {
    "a": "Json Test"
  },
  "components": [
    {
      "reference": "Json Test",
      "type": "panel",
      "content": [
        {
          "link": "abc/123",
          "label": {
            "a": "for test 123 - a",
            "b": "for test 123 - b"
          }
        },
        {
          "link": "abc/101112",
          "label": {
            "a": "for test 101112 - a",
            "b": "for test 101112 - b"
          }
        },
        {
          "link": "abc/456",
          "label": {
            "a": "for test 456 - a",
            "b": "for test 456 - b"
          }
        },
        {
          "link": "abc/789",
          "label": {
            "a": "for test 789 - a",
            "b": "for test 789 - b"
          }
        }
      ]
    }
  ]
}

我试图访问索引并添加一些测试字符串,下面的命令将替换原始数据。

jq '.components[].content[1] + { "link" : "test" } ' test.json
qyswt5oh

qyswt5oh1#

你可以使用切片过滤器来提取数组的头部和尾部,然后使用+来连接头部+新对象+尾部,最后,使用update-assignment |=来修改数组:

.components[].content |= .[0:1] + [{ link: "test" }] + .[1:]

如果您打算更频繁地使用这个函数,请考虑定义一个可重用的函数:

def splice($at; $obj): .[0:$at] + [$obj] + .[$at:]; 

.components[].content |= splice(1; {link: "test"})
olmpazwi

olmpazwi2#

获取位置1处的空子数组(通过起始和结束位置.[1:1],或者通过起始位置和长度.[1:][:0]进行切片),并将其指定为格式为的插入值(单元素)数组[{"link": "test"}](因为你毕竟是在给一个数组赋值--如果你想一次添加所有的项,可以添加更多的项)。这看起来和你最初的尝试差不多:

jq '.components[].content[1:1] = [{"link": "test"}]' test.json

为了方便起见,您还可以将其转换为insertAt函数:

def insertAt($pos; $val): .[$pos:$pos] = [$val];

.components[].content |= insertAt(1; {"link": "test"})

相关问题