【问题标题】:Command to find a function in a file and print its contents在文件中查找函数并打印其内容的命令
【发布时间】:2014-05-14 13:44:04
【问题描述】:

我正在寻找一个 grep、sed 或 awk 命令,它们将在文件中递归搜索函数名,如果函数名匹配,则打印该函数的内容。

int function_name(){
    //Body
    for(int i = 0; i < 3; ++i){
       //this too
    }
    //with this
}

我希望能够使用终端命令,如果我不知道什么文件 function_name()is in I can search forfunction_name()`,它将打印出来

//Body
for(int i = 0; i < 3; ++i){
    //this too
}
//with this

我现在使用的那种作品是grep -r -A 100 "function_name()" *,但在找到函数后总是显示 100 行。问题是有些函数少于 100 并且它显示了我不需要的东西,有些超过 100 行会被截断。

我对正则表达式不太熟悉,但我希望它能打印大括号 { Print This } 之间的所有内容,即使最外面的大括号中有大括号。

【问题讨论】:

  • 普通正则表达式不能匹配大括号。一些较新的正则表达式引擎可以,但这些扩展在 grepawksed 中不可用。不过,您也许可以通过匹配缩进级别来做到这一点。
  • 正确的唯一可靠方法是为您正在解析的语言找到一个解析器。

标签: regex linux awk grep sh


【解决方案1】:

正如我在 cmets 中所说,标准 UNIX 工具中可用的正则表达式无法匹配大括号。考虑到字符串、cmets 中的大括号时,事情会变得更加丑陋......

这是使用缩进匹配的可能解决方案。如果你把它保存为findfunc.awk:

BEGIN {
  printing = 0;
  indent = ""; 
}
{
  if (printing) {
    if ($0 ~ ("^"indent"}$")) {
      printing = 0;
    } else {
      print;                                                                    
    }   
  } else if ($0 ~ ("^[^(]*"name"\\(.*\\)\\s*{$")) {
    indent = gensub(/^(\s*).*$/, "\\1", $0);
    printing = 1;
  }
}

你可以这样调用它:

awk -f findfunc.awk name=function_name source.c

【讨论】:

  • 这很好用!我将如何编辑else if ($0 ~ ("^[^(]*"name"\\(.*\\)\\s*{$")) 以允许{ 位于下一行?
猜你喜欢
  • 2020-08-03
  • 2018-11-11
  • 1970-01-01
  • 2021-03-01
  • 2012-03-24
  • 2013-01-27
  • 2014-04-02
  • 2021-03-28
  • 2022-10-12
相关资源
最近更新 更多