Замена значений параметров в одном файле (.properties )значениями из другого файла (.json)

Эта проблема действительно была для меня, хотя ни одно из предложенных решений не работало для меня, пока я не нашел этот пост на Reddit. Я просто пошел и добавил эту строку в/etc/resolv.conf

nameserver 8.8.8.8 # Google dns

вы можете попробовать любой другой DNS и посмотреть, какой из них вам подходит.

1
14.04.2020, 14:47
2 ответа

Проанализируйте документ 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..)
1
19.03.2021, 02:29

Существуют более подходящие инструменты для работы с файлами 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}
0
19.03.2021, 02:29

Теги

Похожие вопросы