使用正则表达式是不可靠的,双重不与egrep,除非你遵循一些约定,并没有做任何太难。
考虑:
void *
function(
int a,
void (*pointer)(const char *, int, double),
double d
)
本声明分布在6号线 - 和egrep的仅着眼于一行在同一时间。
该声明包含5个逗号和3个参数。
如果你对你正在搜索的代码施加了足够的限制,你可能会近似于你以后的内容,但是C和C++都很难分析。我甚至都没有想过为你调用函数的宏。
你提出的解决方案有许多漏洞,甚至解决与外来反斜杠的问题(由Tim Pietzcker正确诊断)后:
egrep "find" * | egrep "\([^,]*,[^,]*,[^,]*\)"
这将发现线路如:
find(1, 2, 3);
int extra_find(int a, int b, int c) { ... }
extraordinary(find, 3, 21);
printf("find: %.*s\n", 13, "heliotrope");
for (find(1); printf("%d %d\n", 1, 2); x++)
for (x(find, 1); b < max(c, d); i++)
/* find(1,2,3) */
其中只有一个是函数定义,但仍不是您想要的输出之一。
如果您可以使用Perl(或Python)或任何带有PCRE(Perl兼容正则表达式)的工具或同等工具来玩游戏,那么您可以做一些事情,例如确保在单行上单词'find'出现,然后出现左括号,由逗号和空格分隔的“类型名称”值序列以及右括号。
perl -ne 'print if m/\bfind\s*\(\w+\s+\w+(\s*,\s*\w+\s+\w+){2}\s*\)/'
但是(如果使用的是C++或参考文献),其不处理指针,数组限定符像“常量”,或指针的功能,或由“结构somename VARNAME”,或函数引用结构定义受到宏扩展的保护(int (getchar)(int c)
),或者...它仍然不区分声明和定义!
这是什么语言? – 2010-02-09 13:53:16
@Chris:C++。但语言类型对我而言并不重要。我只是想要所有的地方(以文件名::行号的方式)符合我提到的模式。 – 2010-02-09 13:56:04