将值附加到 json 中的元素下

将值附加到 json 中的元素下

例如,以下参数包括列表值(机器列表)

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

由于您使用的是bashshell,因此您可以访问数组。使用数组来存储机器列表:

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"
  ]
}

相关内容