Bash for循环没有用sed完成

时间:2015-06-01 20:13:36

标签: linux bash shell sed

我想在模板查询中阅读并使用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

1 个答案:

答案 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