예를 들어 다음 매개변수에는 목록 값(머신 목록)이 포함됩니다.
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
어레이에 액세스할 수 있습니다. 배열을 사용하여 머신 목록을 저장합니다.
machines=(
worker01.sys645.com
worker02.sys645.com
worker03.sys645.com
worker04.sys645.com
worker05.sys645.com
)
쉘이 배열을 사용하지 않는 경우 위치 인수 목록을 사용하십시오.
set -- worker01.sys645.com \
worker02.sys645.com \
worker03.sys645.com \
worker04.sys645.com \
worker05.sys645.com
접두어를 붙이면 jq
도구는 인수 목록 끝에 목록을 가져온 다음 표현식에서 (JSON 배열)을 사용하여 해당 목록에 액세스할 수 있도록 --args
허용합니다 .$ARGS.positional
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"
]
}