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

时间:2015-11-05 23:27:04

标签: shell scripting

我有一个配置文件。例如。 的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中的变量并返回转换后的文本。

输出:

DROP TABLE cg_company_activity_test_product;
Select * from test_table

关于如何在bash脚本中执行此操作的任何想法?我知道Jinja可以做到这一点,但我想避免python。

1 个答案:

答案 0 :(得分:0)

$ awk -F' *= *' 'FNR==NR{gsub(/"/,""); a[$1]=$2;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[$1]=$2;next}

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

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

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

  • a[k]

    这是用于打印线的awk简洁速记。