我有一个文件some.properties
,它有参数。
DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..
我有另一个文件,它是demo.json
文件并且具有值:
{
"database_conf" : {
"DB_NAME": "ABC",
"DB_HOST": "HOST_ABC",
"..": "..",
"...": "..."
}
}
如何编写 shell 脚本文件以使用文件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}