如何使用 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 打印行。
我有一个配置文件。例如。 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 打印行。