例如,以下参数包括列表值(机器列表)
echo $list_of_machine
worker01.sys645.com worker02.sys645.com worker03.sys645.com worker04.sys645.com worker05.sys645.com
我们有这个标准的 json
{
"MNN_server": [
"master02.sys645.com"
],
"HTTP_SERVER": [
"master01.sys645.com",
]
}
如何附加值 - $list_of_machine 下HTTP_服务器元素 ,如下
预期成绩
{
"MNN_server": [
"master02.sys645.com"
],
"HTTP_SERVER": [
"master01.sys645.com",
"worker01.sys645.com",
"worker02.sys645.com",
"worker03.sys645.com",
"worker04.sys645.com",
"worker05.sys645.com"
]
}
答案1
]
请注意,您的“标准 JSON”实际上并不是 JSON(在结束之前有一个额外的逗号HTTP_SERVER
)。
另外,sed
仅当源按照您需要的方式格式化时才有效,它不适用于任意 JSON(可能没有换行符)。
所以更好的解决方案是使用jq
,如
$ jq --arg list "$list_of_machine" '.HTTP_SERVER|=.+($list|split(" "))' < your_file.json
{
"MNN_server": [
"master02.sys645.com"
],
"HTTP_SERVER": [
"master01.sys645.com",
"worker01.sys645.com",
"worker02.sys645.com",
"worker03.sys645.com",
"worker04.sys645.com",
"worker05.sys645.com"
]
}
your_file.json
当然,有一个格式良好的。
答案2
由于您使用的是bash
shell,因此您可以访问数组。使用数组来存储机器列表:
machines=(
worker01.sys645.com
worker02.sys645.com
worker03.sys645.com
worker04.sys645.com
worker05.sys645.com
)
如果您碰巧发现自己的 shell 不使用数组,请使用位置参数列表:
set -- worker01.sys645.com \
worker02.sys645.com \
worker03.sys645.com \
worker04.sys645.com \
worker05.sys645.com
如果您在其前面加上 ,该jq
工具能够在其参数列表的末尾获取一个列表,--args
然后允许您$ARGS.positional
在表达式中使用(JSON 数组)访问该列表jq
。
然后,您可以将计算机列表附加到 JSON 文件,假设其语法正确(您的示例在错误的位置包含逗号):
jq '.HTTP_SERVER += $ARGS.positional' file.json --args "${machines[@]}"
或者,使用位置参数列表中的列表:
jq '.HTTP_SERVER += $ARGS.positional' file.json --args "$@"
请注意,--args
字符串列表必须是命令行上的最后一个内容。
输出将转到标准输出流。
答案3
缩进略有不同。
$ sed 's/\("master01.sys645.com",\)/\1'$(echo -e "\\\\n\\\\t\"${list_of_machine// /\",\\\\n\\\\t\"}\"")'/' json
{
"MNN_server": [
"master02.sys645.com"
],
"HTTP_SERVER": [
"master01.sys645.com",
"worker01.sys645.com",
"worker02.sys645.com",
"worker03.sys645.com",
"worker04.sys645.com",
"worker05.sys645.com"
]
}