今天遇到了这么一个问题,同事写的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.sqldone
执行此脚本,会对每一个"tmp.dat"进行匹配替换成"sql_**.dat",到达预期目标。