Эта проблема действительно была для меня, хотя ни одно из предложенных решений не работало для меня, пока я не нашел этот пост на Reddit. Я просто пошел и добавил эту строку в/etc/resolv.conf
nameserver 8.8.8.8 # Google dns
вы можете попробовать любой другой DNS и посмотреть, какой из них вам подходит.
Проанализируйте документ 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..)
Существуют более подходящие инструменты для работы с файлами 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}