Заменить значения параметров в одном файле (.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_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}

Связанный контент