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_conf
jq
sed
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}