【发布时间】:2015-08-15 10:33:06
【问题描述】:
我想读入一个模板查询并使用 bash 将某些文本替换为我在脚本中定义的键/值对。下面是我的代码。
我的 bash 脚本
#!/usr/bin/env bash
declare -A date_array
date_array[ly_end_date]="'2014-04-20'"
date_array[ly_4wks_beg_date]="'2014-03-24'"
date_array[ly_13wks_beg_date]="'2014-01-20'"
date_array[ly_52wks_beg_date]="'2013-04-21'"
date_array[ty_end_date]="'2015-03-22'"
date_array[ty_4wks_beg_date]="'2015-02-23'"
date_array[ty_13wks_beg_date]="'2014-12-22'"
date_array[ty_52wks_beg_date]="'2014-03-24'"
today=$(date +%F)
for f in ly_queries.template ty_queries.template; do
filename="${f%.*}"
for key in "${!date_array[@]}"; do
value=${date_array[$key]}
sed "s/${key}/${value}/g" "${f}" > "${filename}""-""${today}"".hql";
done
done
我的模板文件:
select foo
from bar
where date between ly_4wks_beg_date and ly_end_date;
结果:
select foo
from bar
where date between ly_4wks_beg_date and '2014-04-20';
我的脚本已完成,但只有 ly_queries.template 文件将变量 ly_end_date 替换为输出中的相关值。任何人都可以为我提供一些解决方案的见解吗?非常感谢。
Bash 版本:GNU Bash 4.1.2
Sed 版本:GNU sed 4.2.1
系统:RHEL 6.6 Santiago
【问题讨论】:
-
每次通过您的内部循环,您都会从原始文件开始作为
sed的输入文件。 -
与其替换查询中的字符串,不如使用用户变量:
between @ly_4wks_beg_date and @ly_end_date,然后在SELECT之前给变量赋值?