我有一个文件,它是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文件。
你的帮助是非常感谢的。
发布于 2020-04-14 08:41:21
用jq解析JSON文档以创建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表达式将为.database_conf对象中的每个键值对创建一个sed表达式。给定数据的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..)发布于 2020-04-14 06:49:39
有更合适的工具来处理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}https://unix.stackexchange.com/questions/579884
复制相似问题