あるファイル(.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}

関連情報