извлечь текст между парой скобок, используя awk - PullRequest
0 голосов
/ 26 мая 2011

У нас есть файл SQL с определениями функций.Мы хотим прочитать этот файл и подготовить другой файл SQL со всеми операторами отбрасывания DDL для всех функций в первом файле SQL.

Например, первый 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 в виде:

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 Ответ

1 голос
/ 26 мая 2011

Если ваш пример выходных данных (за исключением дополнительных открытых парен) - это все, что вам нужно, то я думаю, что ваш сценарий слишком убит.Как насчет этого?

#! /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) Когда вы увидите хорошие вопросы и ответы, оцените их, используясерые треугольники, http://i.stack.imgur.com/kygEP.png, поскольку доверие к системе основано на репутации, которую пользователи получают, делясь своими знаниями.Также не забудьте принять ответ, который лучше решит вашу проблему, если таковой имеется, нажав на значок галочки, http://i.stack.imgur.com/uqJeW.png

...