2011-05-26 159 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

相关问题