매개변수가 있는 파일이 있습니다 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}