regex - 在文件中查找函数并打印其内容的命令

标签 regex linux awk grep sh

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

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

我希望能够使用终端命令,如果我不知道 function_name() 在哪个文件中,我可以搜索function_name()`,它将打印出来

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

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

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

最佳答案

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

这是使用缩进匹配的可能解决方案。如果将其另存为 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

关于regex - 在文件中查找函数并打印其内容的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825615/

相关文章:

linux - 查找两个文件的列中具有相同值的行

awk - 用新行sed替换第二个空格

c++ - 正则表达式中带有圆括号的正则表达式错误

c# - 需要有关正则表达式的帮助,而不是替换表达式的所有实例

c# - 如何不包含正则表达式的一部分

regex - sed 查找并替换 fastq 正则表达式

regex - 使用正则表达式的 linux shell 脚本字符串操作

python - 如何使用子进程在python中解压gz文件

regex - Bash:重新定位字符串中的子字符串

linux - centos 7 挂载网盘 : mount error(13): Permission denie