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

时间:2019-01-11 05:55:47

标签: 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"
    ]
  }
]

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

 {
    "name": "NEW Configuration",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "newfile.yaml"
    ]
  }, 

您能建议使用jq或sed怎么做吗?

谢谢 萨拉瓦南

2 个答案:

答案 0 :(得分:1)

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

.[0:$i+1] + [$o] + .[$i+1:]

因此,任务归结为找到$ i,可以有效地完成以下操作:

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

请确保我们处理了我们预期不会在数组中出现的对象的可能性,我们可以按以下步骤将各个部分放在一起:

(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

设置$o的一种方法是在命令行上,例如遵循以下原则:

jq --argjson o '....' -f insert.jq 1.json

indexof

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

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

然后解决方案变为:

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

答案 1 :(得分:0)

您可以使用map/1进行插入。在映射中,您可以检查您当前是否在要插入的节点之后并输出该节点,以及要插入的新节点,否则无需进行进一步修改。

$ jq --argjson i '...' 'map(if .name == "Management Configuration" then ., $i else . end)'