我正在寻找 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/