为什么sed会替换我的引号?

时间:2017-11-03 12:37:40

标签: bash sed

我有一个SQL查询,其中包含:

join (&max_dt1) t3

我想替换&max_dt1所以:

MAX_DT1="'2017-11-03'"
REPLACE="sed -i 's/&max_dt1/select ($MAX_DT1) as dt/g' $FINAL_QUERY"
cat $FINAL_QUERY | eval $REPLACE

结果:

join (select (2017-05-09) as dt) t3

为什么要删除变量MAX_DT1的引号?

我的真实代码:

MAX_DT1="'$MAX_DT1'"
echo $MAX_DT1
REPLACE="sed -i 's/&max_dt1/select ($MAX_DT1) as dt/g' $FINAL_QUERY"
echo sed -i "s/&max_dt1/select ($MAX_DT1) as dt/g $FINAL_QUERY
cat $FINAL_QUERY | eval $REPLACE

MAX_DT1首先包含:2017-11-03

2 个答案:

答案 0 :(得分:2)

按照这个

$ query="join (&max_dt1) t3"
$ MAX_DT1="'2017-11-03'"   # <--- you have to quote the single quotes!!
$ sed "s/&max_dt1/select ($MAX_DT1) as dt/g" <<< $query

join (select ('2017-11-03') as dt) t3

答案 1 :(得分:1)

引号表示您将字符串影响到MAX_DT1变量。它不属于你的字符串。 如果您的变量值必须包含引号,则必须添加它们。 例如:

MAX_DT1="'2017-11-03'"

不幸的是,你的Next REPLACE变量不会有你期望的东西,而后来调用的eval命令也不会起作用,因为它的sed命令格式不正确(如果你保持你的代码这样)

幸运的是,如果以这种方式直接调用sed命令,问题就解决了:

MAX_DT1="'2017-11-03'"
sed -i "s/&max_dt1/select ($MAX_DT1) as dt/g" $FINAL_QUERY