如何使用 bash 替换配置文件中变量的特定文本?

How to use bash to replace specific text from variables in a config file?

我有一个配置文件。例如。 config.cfg

product_name = "test_product"
table_name = "test_table"

我有一个输入文件: input.sql

DROP TABLE cg_company_activity_{{product_name}}; 
Select * from {{table_name}}

我想编写一个 bash 脚本来接收任何输入文件并搜索并替换 config.cfg 和 returns 转换文本中的变量。

输出:

DROP TABLE cg_company_activity_test_product;
Select * from test_table

知道如何在 bash 脚本中执行此操作吗?我知道 Jinja 可以做到这一点,但我想避免 python.

$ awk -F' *= *' 'FNR==NR{gsub(/"/,""); a[]=;next} {for (k in a)sub("{{" k "}}", a[k])} 1' config.cfg input.sql
DROP TABLE cg_company_activity_test_product; 
Select * from test_table

工作原理

  • -F' *= *'

    告诉 awk 使用可选空格后跟 = 后跟可选空格作为字段分隔符。

  • FNR==NR{gsub(/"/,""); a[]=;next}

    在读取第一个文件时,config.cfg,(1) 删除所有 ",(2) 分配第二个字段,</code>,作为关联数组 <code>a 使用键 </code>,以及 (3) 跳过剩余的命令并跳转到 <code>next 行重新开始。

  • for (k in a)sub("{{" k "}}", a[k])

    对于数组 a 中的每个键 k,在当前行中查找 {{ k }} 并将其替换为关联数组 a[k].

  • 1

    这是 awk 的神秘 shorthand 打印行。