2013-10-30 44 views
1

所以我有這樣awk來瞰引號

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

您忘記了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 
}