如何根据行号找到封装函数名

如何根据行号找到封装函数名

我正在查看一个日志文件,它只告诉我该文件中存在错误的文件名和行号。我感兴趣的是了解封装函数。例如,以下是日志文件的内容

    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_442ghi返回。我尝试过以下方法

# 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 (...)因为之前有一个空格(

答案1

由于无法正确解析源代码,因此我们不会被可能错误匹配的注释或字符串所困扰,下面的脚本只是从给定文件中的给定行号向后搜索字符串"function "(用引号引起来,以便您可以查看不可见的尾随空格):

#!/bin/sh
while read -r error file on line linenum
do
  : "SC2034: $error, $on, and $line are unused"
  printf 'For error in %s on line %d:\n' "$file" "$linenum"
  ed -s "$file" << EOF | sed '1d; s/function //; s/(.*//'
  $linenum
  ?function 
  q
EOF
  echo
done < logfile

while循环将其读logfile入两个重要变量:“$file”和“$linenum”。然后它调用ed“$file”并为其提供一个包含指令列表的此处文档,即:

  1. 转到“$linenum”行
  2. 向后搜索字符串"function "——有那个看不见的空间
  3. q伊特

的输出ed将是两行: $linenum 的内容,后面是匹配 的行"function "。这就是为什么我们将所有输出传递给sed,它被赋予三个命令:

  • 1d-- 删除输出的第一行
  • s/function //-- 删除字符串"function "
  • s/(.*//-- 从左括号开始删除

根据您的输入,示例输出为:

For error in foo.file on line 13:
    def_442

For error in foo.file on line 25:
    ghi

重新格式化以适应口味。

相关内容