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

쉘을 사용하고 있으므로 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.positionaljq

그런 다음 구문이 올바른 경우(예제에 잘못된 위치에 쉼표가 포함되어 있음) 컴퓨터 목록을 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"
  ]
}

관련 정보