Files

如何在不擷取註釋的情況下對原始碼進行 grep

  • June 6, 2017

我搜尋了一種在原始碼上 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 程序的底層語法一無所知。因此,為了不搜尋內部評論,您有幾個選擇:

  1. 搜尋前去除 C-comments,您可以這樣做使用gcc -fpreprocessed -dD -E yourfile.c詳細資訊,請參閱https://stackoverflow.com/questions/2394017/remove-comments-from-cc-code
  2. 編寫/使用您已經找到的一些 hacky 半工作腳本(例如,它們通過跳過以//or開頭的行來工作/*)以處理所有可能的 C/C++ 註釋的細節(再次,請參閱上一個連結以獲取一些可怕的測試案例) . 那麼你仍然可能有誤報,但你不必預處理任何東西。
  3. 使用更高級的工具在程式碼中進行“語義搜尋”。我找到了“cocgigrep”:http ://home.regit.org/software/coccigrep/這種工具允許搜尋一些特定的語言語句(即更新具有給定名稱的結構),當然它們會刪除評論。

引用自:https://unix.stackexchange.com/questions/33131