您能否暗示如何通过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怎么做吗?
谢谢 萨拉瓦南
答案 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
使用以下通用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)'