使用正則表達式是不可靠的,雙重不與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