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

関連情報