2011-05-26 154 views
0

我們有一個帶有函數定義的SQL文件。我們想要讀取這個文件,併爲第一個SQL文件中的所有函數準備另一個包含所有DDL語句的SQL文件。使用awk提取一對括號之間的文本

例如第一SQL有這樣的內容:

CREATE OR REPLACE FUNCTION folder_cycle_check (folder_key INTEGER, new_parent_folder_key INTEGER) RETURNS VOID AS $procedure$ 

DECLARE 
    parent_of_parent INTEGER; 
BEGIN 
    IF folder_key = new_parent_folder_key THEN 
     RAISE EXCEPTION 'Illegal cycle detected',new_parent_folder_key; 
    END IF; 
SELECT INTO parent_of_parent (SELECT parent_folder_key FROM folder where folder_key = new_parent_folder_key); 

IF new_parent_folder_key IS NOT NULL THEN 
    PERFORM folder_cycle_check(folder_key, parent_of_parent); 
END IF; 

END; $procedure$ 
LANGUAGE plpgsql; 

現在我想創建目標SQL文件:

DROP FUNCTION folder_cycle_check((folder_key INTEGER, new_parent_folder_key INTEGER) 

對於這個實現我有一個「genDrop。 txt「文件,我將它傳遞給awk.exe命令以及第一個SQL文件。與「genDrop.txt」的問題是,它僅生成與下降的語句作爲目標SQL文件:

DROP FUNCTION folder_cycle_check 
which is not useful because PostgreSQL wants like this: 
DROP FUNCTION folder_cycle_check(folder_key INTEGER, new_parent_folder_key INTEGER) 

任何人可以幫助我嗎?我是awk編程的新手。 僅供參考,在「genDrop.txt」是這樣的:

####################################################################### 
# AWK program to generate drop statements from create table, procedure, and view statements 
############################################################################ 

function dropit(objtype, objname, rulename) 
{ 
# l[lines++] = "DROP " objtype " " objname " -- Line " NR ", Rule " rulename; 
    l[lines++] = "DROP " objtype " " objname 
    next 
} 

function dropitpg(objtype, objname, funcargs, rulename) 
{ 
# l[lines++] = "DROP " objtype " " objname " -- Line " NR ", Rule " rulename; 
    l[lines++] = "DROP " objtype " " objname " " funcargs 
    next 
} 


BEGIN { FS="[ (;]*" } 
# trim the line 
{$2 = $2 } 
# "grab creates" 
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Pp][Rr][Oo][Cc]/    {dropit($3, $4, "CPs") } 
/^[Cc][Rr][Ee][Aa][Tt][Ee] *[Pp][Rr][Oo][Cc]/    {dropit($2, $3, "CP") } 

/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Pp][Rr][Oo][Cc]/ {dropit($5, $6, "CPs") } 
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Pp][Rr][Oo][Cc]/ {dropit($4, $5, "CP") } 


/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Vv][Ii][Ee][Ww]/    {dropit($3, $4, "CVs") } 
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Vv][Ii][Ee][Ww]/    {dropit($2, $3, "CV") } 

/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Vv][Ii][Ee][Ww]/ {dropit($5, $6, "CRVs") } 
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Vv][Ii][Ee][Ww]/ {dropit($4, $5, "CRV") } 


/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Tt][Aa][Bb][Ll][Ee]/    {dropit($3, $4, "CTs") } 
/^[Cc][Rr][Ee][Aa][Tt][Ee] *[Tt][Aa][Bb][Ll][Ee]/   {dropit($2, $3, "CT") } 

/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Ss][Ee][Qq][Uu][Ee][Nn][Cc][Ee]/  {dropit($3, $4, "CSs") } 
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Ss][Ee][Qq][Uu][Ee][Nn][Cc][Ee]/ {dropit($2, $3, "CS") } 

/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/  {dropit($3, $4, "CSs") } 
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/ {dropit($2, $3, "CS") } 


END{ 
    print "-- Beginning " lines " drop statements" 
    for (i = lines - 1; i >= 0; --i) { 
    print l[i] 
    print EOS 
    print "" 
    } 
    print "-- End of " lines " drop statements" 
} 

BEGIN { FS="[ ;]*" } 
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/  {dropitpg($5, $7, "CSs") } 
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/ {sed -nr "s/\s*\[([^\]+)\]/\1/p" } 

END{ 
    print "-- Beginning " lines " drop statements" 
    for (i = lines - 1; i >= 0; --i) { 
    print l[i] 
    print EOS 
    print "" 
    } 
    print "-- End of " lines " drop statements" 
} 
+1

我讀了這3次現在,我不明白的問題 – 2011-05-26 13:17:37

+0

您的示例輸出(在第二個代碼塊)顯示2個開頭的包袱,這是你真正想要的嗎?祝你好運。 – shellter 2011-05-26 14:02:04

回答

1

如果你的榜樣輸出(減去多餘的開括號)是你所需要的話,我覺得你的腳本是超必殺。這個怎麼樣?

#! /bin/awk -f 
{ 
    if ($2 ~ /[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/) { 
     funcName=$3 
     argSig=$0 
     srchTarg= "^.*" funcName 
     sub(srchTarg,"",argSig) 
     # print "argSig=" argSig 
     sub(/[\)].*$/, ")", argSig) 
     # print "argSig=" argSig 
     print "DROP FUNCTION " funcName argSig 
    } 
} 

一定要chmod 755 genDrop.awk

樣品運行

(我改變了你的樣品輸入到第一線)

CREATE FUNCTION folder_cycle_check(....

樣品運行

$ genDrop.awk dropFunction.txt 
DROP FUNCTION folder_cycle_check (folder_key INTEGER, new_parent_folder_key INTEGER) 

此外,命名您的awk腳本genDrop.txt尚未在溝通你的意圖是什麼幫助了,想必你的意思是genDrop.awk

我希望這有助於。

請允許我歡迎你們來的StackOverflow,並提醒三件事,我們通常在這裏做的:1)當你得到幫助,儘量給它也是如此,在你的專長2的面積回答問題)閱讀常見問題解答,http://tinyurl.com/2vycnvr,3)當您看到好的Q & A時,請使用灰色三角形http://i.stack.imgur.com/kygEP.png對其進行投票,因爲系統的可信度基於用戶通過分享知識獲得的聲譽。還記得接受答案,更好地解決您的問題,如果有的話,通過按複選標記,http://i.stack.imgur.com/uqJeW.png

相關問題