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

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

我有一个文件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_confjqsed

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}

相关内容