한 파일(.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}

관련 정보