【问题标题】:JQ - how to insert in middle of an array object through jqJQ - 如何通过 jq 在数组对象中间插入
【发布时间】:2019-01-11 05:55:46
【问题描述】:

您能否提示如何通过 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 吗?

谢谢 沙巴南

【问题讨论】:

  • 如果多次满足插入条件怎么办?

标签: json sed jq


【解决方案1】:

首先,假设我们知道名为“管理配置”的对象的索引是 $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

索引

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果可能需要多次插入,这将是合适的,但否则将是错误的或低效的。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多