awk to scape引号

时间:2013-10-30 22:57:50

标签: awk quotes

所以我有一个像

这样的文件
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)来说太乱了,而且无法正常工作。

有人能给我一个快速的出路吗?

1 个答案:

答案 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
}