我想在模板查询中阅读并使用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
答案 0 :(得分:1)
在内部循环中,您将继续根据原始文件进行更改,而不是根据以前的密钥修改的文件。而不是执行多个sed
命令,构建一个包含所有更改的命令:
for f in ly_queries.template ty_queries.template; do
filename="${f%.*}"
changes=()
for key in "${!date_array[@]}"; do
value=${date_array[$key]}
changes+=(-e "s/${key}/${value}/g")
done
sed "${changes[@]}" "${f}" > "${filename}-${today}.hql";
done