JSON 파일에서 문자열 일치 후 새 줄 추가

JSON 파일에서 문자열 일치 후 새 줄 추가

다음 작업에 도움이 필요합니다.

JSON 파일에는 다음과 유사한 섹션이 있습니다.

"Principal": {
                "AWS": [
                    "arn:aws:iam::12345677890:root",
                    "arn:aws:iam::12345677891:root",

"AWS": [ 문자열을 찾아야 하며 "arn:aws:iam::33333333333:root"라는 새 줄을 추가해야 업데이트된 json 콘텐츠가 아래와 같아야 합니다.

"Principal": {
                "AWS": [
                    "arn:aws:iam::33333333333:root",
                    "arn:aws:iam::12345677890:root",
                    "arn:aws:iam::12345677891:root",

sed를 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

Principal당신이 JSON 문서의 최상위 개체이고, 쉘 변수에 저장된 일부 문자열을 entry그 아래(처음에) 배열에 추가하려고 한다고 가정해 보겠습니다 AWS.

entry='arn:aws:iam::33333333333:root'

jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json

이 표현식은 jq명령줄에서 할당을 사용하여 변수에 포함된 문자열을 배열의 시작 부분에 추가합니다(추가된 요소부터 시작하여 원래 배열의 요소가 뒤따르는 새 배열로 배열을 업데이트/다시 작성합니다).jq$e--argAWS|=$e

요소 추가배열 수정은 약간 더 쉬울 것이며 아마도 더 효율적일 것입니다(전체 배열을 다시 작성할 필요가 없기 때문에).

jq --arg e "$entry" '.Principal.AWS += [$e]' file.json

시험:

$ cat file.json
{
  "Principal": {
    "AWS": [
      "arn:aws:iam::12345677890:root",
      "arn:aws:iam::12345677891:root"
    ]
  }
}
$ entry='arn:aws:iam::33333333333:root'
$ jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
{
  "Principal": {
    "AWS": [
      "arn:aws:iam::33333333333:root",
      "arn:aws:iam::12345677890:root",
      "arn:aws:iam::12345677891:root"
    ]
  }
}
$ jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
{
  "Principal": {
    "AWS": [
      "arn:aws:iam::12345677890:root",
      "arn:aws:iam::12345677891:root",
      "arn:aws:iam::33333333333:root"
    ]
  }
}

답변2

sed여기 도구가 잘못되었습니다.JSON은 일반 언어가 아닙니다따라서 정규식을 적용할 수 있는 도구는 유효한 JSON을 모두 구문 분석할 수 없습니다.

따라서 JSON을 구문 분석하고 수정하기 위해 특별히 설계된 도구를 사용하는 것이 jq좋습니다. 하지만 일반적으로 가끔 사용자의 경우 문자 그대로 7줄의 Python을 작성하는 것이 더 깔끔합니다.

#!/usr/bin/env python3
# You'll want to save this to a file, e.g. mypythonscript,
# and make it executable: chmod 755 mypythonscript
import json, sys
data_in = None
with open(sys.argv[1]) as infile:
  data_in = json.load(infile)
data_in["AWS"] = ["arn:aws:iam::33333333333:root"] + data_in["AWS"]
with open(sys.argv[1], "w") as outfile:
  json.dump(data_in, outfile)

당신을 정당하게 만들 것입니다

./mypythonscript data.json

관련 정보