Как найти имя инкапсулирующей функции по номеру строки - PullRequest
0 голосов
/ 18 марта 2019

Я смотрю на файл журнала, который просто сообщает мне имя файла и номер строки в этом файле с ошибкой. Что меня интересует, так это знание инкапсулирующей функции. Например, вот содержимое файла журнала

    Error: foo.file on line wxy
    Error: foo.file on line xyz
    .
    .
    .

и вот содержимое файла foo.file

function abc_1234 (...)
    .
    .
    .


    endfunction

    function def_442 ()
    .
    .
    .
   //Following line number is  WXY
    assign Z ==== X;

    endfunction


    function ghi(...)
    .
    .
    .


  //Following line number is  XYZ
    assign X = X;
    endfunction

   .
   .
   .

На основании приведенного выше файла журнала я хочу получить имена функций def и ghi. Я попытался частичное решение, предоставленное @larsks и добавил [[::blank::]]

# look for function definitions and record the function name
# in the func_name variable
/function [[:alpha:]][[:alnum:]]*[[:blank:]]*([^)]*)/ {
  func_name = substr($2, 1, index($2, "(")-1);
}

# when we reach the target line number, print out the current
# value of func_name
NR == target {
  print func_name
}

Ошибка на abc_1234 (...) и def_442 (...), поскольку до ( есть пробел. Я не могу заставить работать выше

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Вы можете попробовать решение Perl, как показано ниже

$ perl -0777 -ne ' while( /function\s+(\w+).+?endfunction/sg) { print "$1\n" } ' tulamba.log
abc_1234
def_442
ghi

$
2 голосов
/ 18 марта 2019

Чтобы сопоставить номер строки определению функции, вам нужно будет перебрать исходный файл в поисках определений функции, а затем распечатать текущий, когда вы встретите целевой номер строки.Например, что-то вроде этого:

# look for function definitions and record the function name
# in the func_name variable. This looks for lines matching the pattern
# function <space> <identifier>(<anything>), and records the
# <identifier> part in func_name.
/function [[:alpha:]][[:alnum:]]* *([^)]*)/ {
        func_name = $0
        func_name = gensub("function *", "", 1, func_name)
        func_name = gensub(" *\\(.*", "", 1, func_name)
}


# when we reach the target line number, print out the current
# value of func_name.  In awk, the variable NR represents the
# current line number, and target is a variable we expect to be
# passed in on the command line.
NR == target {
  print func_name
}

Если вы поместите это в файл с именем findline.awk и назовете его так:

awk -f findline.awk -vtarget=26 mysourcefile.src

Затем будет напечатано имяфункция, которая содержит строку 26. Этот сценарий, как написано, не очень устойчив, но, надеюсь, даст вам некоторые идеи о том, как действовать.

См. документацию awk для получения подробной информации о * 1012.* функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...