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}