使用 jq 将文件中的数组数据添加到现有数组

adding array data from a file to an existing array using jq

我正在生成一个 JSON 文件 (input.json),如下所示:

[
  {
    "name": "MINIMUM_NOTICE_PERIOD",
    "value": "3"
  },
  {
    "name": "SERVER_TIMEZONE",
    "value": "Europe/London"
  }
]

我有一个现有的 JSON 文件 (task.json),它是一个 AWS ECS 任务定义,如下所示:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
          {
            "name": "CRON",
            "value": "no"
          },
          {
            "name": "LOG_CHANNEL",
            "value": "stack"
          }
        ]
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

我正在尝试将 JSON 文件 (input.json) 中的额外值插入任务 def json 文件 (task.json)

我正在使用命令:

jq --argjson envVars "$(<input.json)" '.containerDefinitions[0].environment += [$envVars]' task.json > new-task.json

一切顺利,直到最后结果是:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
        {
          "name": "CRON",
          "value": "no"
        },
        {
          "name": "LOG_CHANNEL",
          "value": "stack"
        },
        [
          {
            "name": "MINIMUM_NOTICE_PE",
            "value": "3"
          },
          {
            "name": "SERVER_TIMEZONE",
            "value": "Europe/London"
          }
        ]
      ]
    },
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

它将文件的全部内容包括打开和关闭 [] 插入到现有数组中,我的目标是更像这样的东西:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
        {
          "name": "CRON",
          "value": "no"
        },
        {
          "name": "LOG_CHANNEL",
          "value": "stack"
        },
        {
          "name": "MINIMUM_NOTICE_PE",
          "value": "3"
        },
        {
          "name": "SERVER_TIMEZONE",
          "value": "Europe/London"
        }
      ]
    },
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

我也试过命令:

jq '.containerDefinitions[0].environment += $inputs' task.json --slurpfile inputs input.json

运行 这给出了相同的结果 JSON 输出。

我曾尝试从 inpur.json 文件中删除括号,但这样做会导致两个 jq 命令出现以下错误:

jq: invalid JSON text passed to --argjson
jq: Bad JSON in --slurpfile inputs input.json

有人知道如何获得我正在寻找的输出吗?任何帮助都是适用的,因为我一直在努力弄清楚最后一部分。

input.json 已经是一个数组,所以你的 jq 过滤器可以像这样简单:

.containerDefintions[0].environments += $envVars

使用 --slurpfile 具有将文件内容包装在数组中的效果,因此您的第二次尝试必须涉及 $inputs[0].

由于 input.json 已经是一个文件,我建议使用 --argfile (即使它已被正式弃用);或者,通过更多的工作,您可以使用 jq ... input.json task.json

行的调用

最后 peak 提出了使用 $inputs[0] 和 --slurpfile 的正确方法。