У меня есть файл 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}