한 파일(.properties)의 매개변수 값을 다른 파일(.json)의 값으로 대체

한 파일(.properties)의 매개변수 값을 다른 파일(.json)의 값으로 대체

some.properties매개변수가 있는 파일이 있습니다 .

DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..

demo.json파일이고 값이 있는 다른 파일이 있습니다 .

{
  "database_conf" : {
    "DB_NAME": "ABC",
    "DB_HOST": "HOST_ABC",
    "..": "..",
    "...": "..."
  }
}

some.properties파일 에 언급된 값으로 파일을 업데이트 하는 쉘 스크립트 파일을 작성하는 방법 demo.json.

도움을 주셔서 감사합니다.

답변1

JSON 문서를 구문 분석하여 스크립트를 jq만든 sed다음 파일에서 스크립트를 실행합니다.

$ jq -r '.database_conf | to_entries | .[] | "s,=\\${\(.key)},=\"\(.value)\","' demo.json | sed -f /dev/stdin some.properties
DATABASE_NAME="ABC"
DATABASE_HOST="HOST_ABC"
..
..
..

이 표현식은 객체의 각 키-값 쌍에 대한 jq표현식을 생성 합니다. 지정된 데이터의 출력은 다음 스크립트입니다.sed.database_confjqsed

s,=\${DB_NAME},="ABC",
s,=\${DB_HOST},="HOST_ABC",
s,=\${..},="..",
s,=\${...},="...",

그런 다음 이 sed -f파일을 읽어 속성 파일의 실제 교체를 수행합니다.

이는 속성 파일의 모든 변수가 다음과 같이 작성되고 변수 ${variablename}앞에 항상 문자가 붙는다고 가정합니다 =.

변경 사항을 적용하려면 sed -i결과를 새 파일로 리디렉션하는 것이 좋습니다.

데이터에 쉼표가 포함된 경우 출력 표현식의 쉼표를 jq데이터에 사용되지 않는 다른 문자로 변경하세요.

구성이 포함된 다른 최상위 개체가 있는 경우 해당 개체를 표현식 시작 부분에 쉼표로 구분된 목록으로 추가하세요 jq. 예를 들어:

jq -r '.application_conf, .database_conf | to_entries (..etc..)

답변2

JSON 파일 처리에 더 적합한 도구가 있습니다. 이 간단한 경우에는 awk다음과 같이 충분할 수 있습니다.

awk '
NR == FNR       {gsub (/[ ",]/, _)              # in first file, remove "punctuation" chars
                 T[$1] = $2                     # and save replacement values in T array
                 next                    
                }

                {P = $2                         # create pattern
                 gsub (/[${}]/, _, P)           # with redundant / undesired chars removed
                }

P in T          {sub (P, T[P], $2)              # if pattern shows up, replace it
                }

1

' FS=":" file2 FS="=" file1
DATABASE_NAME ${ABC}
DATABASE_HOST ${HOST_ABC}

관련 정보