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}