Files
如何在不擷取註釋的情況下對原始碼進行 grep
我搜尋了一種在原始碼上 grep 的方法,而有時不會因為評論而出現誤報。例如,如果我在這個 .c 原始碼上搜尋 foo :
/* * foo has changed [...] and is now a 2-parameters function */ // foo(24) foo(42, 28);
一個天真的
grep
人會發現 3 次我只想要一次。我在 StackOverflow 上看到過這種方法,但它不能滿足我的需求:PHP 在平台上不可用。我也為單行註釋找到了這種方式,但它只解決了我的部分問題。我需要使用經典的腳本工具(awk、sed、bash、grep 等),即使有數千個文件,我也需要它快速。
您現在是否以及如何可以對原始碼進行 grep,並且僅對原始碼進行 grep?
您可以嘗試一種天真的方法來匹配這樣的非評論:
$ egrep -v "^(//|/\*| \*)" sourcecode
這只會與前綴註釋反向匹配 - 即以 , 或 開頭的行
//
-因此/*
它不會遺漏用and對註釋掉的塊。*``*/``/*``*/
grep 適用於純文字,對 C 程序的底層語法一無所知。因此,為了不搜尋內部評論,您有幾個選擇:
- 搜尋前去除 C-comments,您可以這樣做使用
gcc -fpreprocessed -dD -E yourfile.c
詳細資訊,請參閱https://stackoverflow.com/questions/2394017/remove-comments-from-cc-code- 編寫/使用您已經找到的一些 hacky 半工作腳本(例如,它們通過跳過以
//
or開頭的行來工作/*
)以處理所有可能的 C/C++ 註釋的細節(再次,請參閱上一個連結以獲取一些可怕的測試案例) . 那麼你仍然可能有誤報,但你不必預處理任何東西。- 使用更高級的工具在程式碼中進行“語義搜尋”。我找到了“cocgigrep”:http ://home.regit.org/software/coccigrep/這種工具允許搜尋一些特定的語言語句(即更新具有給定名稱的結構),當然它們會刪除評論。