仅在函数定义内搜索字符串

时间:2015-05-26 16:16:38

标签: perl unix awk sed grep

有没有办法只在函数定义中搜索字符串。 我的意思是说假设有一个ac程序文件ac,其中有几个函数的定义存在,但我只想在特定函数内部的那个字符串(让我们说do_something())定义时才输出搜索,有什么方法从命令提示符搜索这样的字符串?
例如,对于以下代码:

#include <stdio.h>
void f(int n,
         int j,
         int k)
{
   printf("name is is pankaj ");
   printf("name is is kumar ");
   printf("name is is mayank ");
}
int main()
{
   printf("name is is pankaj ");
   return 0;
}

对于上述程序,我只想在函数f()中出现一次pankaj,我不希望pankaj作为搜索的输出出现在main函数中。 请忽略程序中的任何语义或语法错误,我的查询仅用于在程序中搜索字符串。

1 个答案:

答案 0 :(得分:0)

当然,试试这个:

$0 ~ fun {
    count = 1
    while (! ($0 ~ /{/))
        getline
    getline
}   

count > 0 {
    if ($0 ~ /{/)
        count++
    if ($0 ~ /}/)
        count--
    if ($0 ~ query)
        print FILENAME ": l" FNR ". " $0
}

并像这样调用脚本:

awk -v query="pankaj" -v fun="void f[(]" -f script.awk inputfile.java

其中query是要搜索的字符串,fun是函数名的正则表达式。

此脚本会计算{}以查看我们何时离开该功能,如果找到匹配则应打印该行。

编辑:您可能希望扩展正则表达式以计算括号,可能需要额外检查以查看它们是否未放入注释中(尽管您从未这样做过)。