使用 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 的正确方法。
我正在生成一个 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 的正确方法。