所以我有一个像
这样的文件select * from tb where start_date = to_date('20131010','yyyymmdd');
p23 VARCHAR2(300):='something something
still part of something above with 'this' between single quotes and close
something to end';
(code goes on)
这将是一些自动生成的代码,我应该能够通过sqlplus执行。但这显然不会起作用,因为第三行的引号应该像(..) with ''this'' between (...)
一样被转义。
我无法访问生成该代码的脚本,但我试图让awk完成这项工作。请注意,脚本必须足够智能,不要在代码中查看每个引用(to_date('20131010','yyyymmdd')
是正确的。)
我不是awk的专家,所以我走得很远:
BEGIN {
RS=";"
FS="\n"
}
/\tp[0-9]+/{
ini = match($0, "\tp[0-9]+")
fim = match($0, ":='")
s = substr($0,ini,fim+1)
txt = substr($0, fim+3, length($0))
block = substr(txt, 0, length(txt)-1)
print gensub("'", "''", block)
}
!/\tp[0-9]+/{
print $0";"
}
但它对print gensub("'", "''", block)
来说太乱了,而且无法正常工作。
有人能给我一个快速的出路吗?
答案 0 :(得分:1)
您忘记了gensub
的一个参数。尝试:
BEGIN {
RS=";"
FS="\n"
}
/^[[:space:]]+p[0-9]+/{
ini = match($0, "\tp[0-9]+")
fim = match($0, ":='")
s = substr($0,ini,fim+1)
txt = substr($0, fim+3, length($0))
block = substr(txt, 0, length(txt)-1)
printf "%s'%s';", s, gensub("'", "''", "g",block)
next
}
{
printf "%s;", $0
}