【问题标题】:Bash for loop not completing with sedBash for 循环没有用 sed 完成
【发布时间】: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之前给变量赋值?

标签: linux bash shell sed


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多