JQ - 如何通过jq插入数组对象的中间

1 json sed jq

您能提示一下如何通过 jq 在数组对象中间插入新元素吗?

1.json 文件:-

[ {
    "name": "Dependencies",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "dependency.yaml",
          ]
  },
  {
    "name": "Management Configuration",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "mgmt-job.yaml"
    ]
  },
  {
    "name": "Data Configuration",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "data-job.yaml"
    ]
  }, 
  {
    "name": "Tools",
    "asyncInstallation": true,
    "failOnError": false,
    "yamls": [
      "tools-job.yaml"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我想在管理配置后插入以下文本。

 {
    "name": "NEW Configuration",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "newfile.yaml"
    ]
  }, 
Run Code Online (Sandbox Code Playgroud)

您能否建议我们如何使用 jq 或 sed 来做?

谢谢萨拉瓦南

pea*_*eak 5

首先,假设我们知道名称为“管理配置”的对象的索引是 $i。然后,假设要插入的对象是$o,我们会这样写:

.[0:$i+1] + [$o] + .[$i+1:]
Run Code Online (Sandbox Code Playgroud)

因此,任务归结为找到 $i,这可以有效地完成,如下所示:

first(range(0;length) as $i
      | select(.[$i].name=="Management Configuration")
      | $i)
Run Code Online (Sandbox Code Playgroud)

小心确保我们处理了我们期望的对象没有出现在数组中的可能性,我们可以将各个部分组合在一起,如下所示:

(first(range(0;length) as $i
 | select(.[$i].name=="Management Configuration")
 | $i) // null) as $i
| if $i then .[0:$i+1] + [$o] + .[$i+1:] else . end
Run Code Online (Sandbox Code Playgroud)

一种设置方法$o是在命令行上,例如:

jq --argjson o '....' -f insert.jq 1.json
Run Code Online (Sandbox Code Playgroud)

指数

使用以下通用定义可能有意义:

def indexof(f):
  first(range(0;length) as $i
        | select(.[$i]|f) | $i) // null;
Run Code Online (Sandbox Code Playgroud)

那么解决方案就变成了:

indexof(.name=="Management Configuration") as $i
| if $i then .[0:$i+1] + [$o] + .[$i+1:] else . end
Run Code Online (Sandbox Code Playgroud)