今天遇到了这么一个问题,同事写的SQL文件中有212条SQL,全部SQL都使用select ... into outfile形式,但是在导出文件名都为"/opt/export/tmp.dat",所以在运行时第二条SQL就报错"/opt/export/tmp.dat"已经存在导致脚本运行失败。于是,就写一个小脚本来解决此问题。


    需求是这样的,在03.sql这个文件中出现了212次“/opt/export/tmp.dat”,要将tmp.dat替换为不同的212个文件名。

    具体是这样实现的:

  • 第一步

使用

grep -n "tmp\.dat" 03.sql |awk -F':' '{print $1}' > list.txt

将03.sql文件中所有包含"tmp.dat"的行号打印出来。

需要注意的是,在使用grep时,默认是使用正则表达式进行匹配的,所有tmp.dat中的"."需要有\进行转义,变为"tmp\.dat",否则的话匹配到的行会不准确。

  • 第二步

    编写脚本,解决问题

for i in `seq 1 212`
do
    line=`head -$i list.txt|tail -1`
    sed -i "${line}s/tmp\.dat/sql_${i}\.dat/g" 03.sql
done

执行此脚本,会对每一个"tmp.dat"进行匹配替换成"sql_**.dat",到达预期目标。