首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一个文件(.properties)上的参数值从另一个文件(.json)的值替换为

问将一个文件(.properties)上的参数值从另一个文件(.json)的值替换为
EN

Unix & Linux用户
提问于 2020-04-14 00:44:18
回答 2查看 1.6K关注 0票数 1

我有一个文件,它是some.properties文件,它有参数。

代码语言:javascript
复制
DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..

我有另一个文件,它是demo.json文件,它有值:

代码语言:javascript
复制
{
  "database_conf" : {
    "DB_NAME": "ABC",
    "DB_HOST": "HOST_ABC",
    "..": "..",
    "...": "..."
  }
}

如何编写shell脚本文件以使用some.properties文件中提到的值更新demo.json文件。

你的帮助是非常感谢的。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-04-14 08:41:21

用jq解析JSON文档以创建sed脚本,然后在文件上运行该脚本:

代码语言:javascript
复制
$ 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脚本:

代码语言:javascript
复制
s,=\${DB_NAME},="ABC",
s,=\${DB_HOST},="HOST_ABC",
s,=\${..},="..",
s,=\${...},="...",

然后由sed -f读取它来对属性文件执行实际的替换。

这假设属性文件中的每个变量都被写入为${variablename},并且它们总是紧跟在=字符的前面。

若要进行就地更改,您可能需要使用sed -i,否则将结果重定向到一个新文件。

如果数据包含逗号,请将jq输出表达式中的逗号更改为数据中未使用的其他字符。

如果您有更多的具有配置的顶级对象,那么在jq表达式的开头将这些对象添加为逗号分隔的列表。例如:

代码语言:javascript
复制
jq -r '.application_conf, .database_conf | to_entries (..etc..)
票数 1
EN

Unix & Linux用户

发布于 2020-04-14 06:49:39

有更合适的工具来处理JSON文件。对于这种简单的情况,awk可能就足够了:

代码语言:javascript
复制
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
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/579884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档