2012-10-10 39 views
1

的git-DIFF報告包含的變化,像這樣的直接功能名稱:grep的報告背景下封閉函數名

$ git diff 
diff --git a/apps/cli/elmo.py b/apps/cli/elmo.py 
index ac056e9..1b7c1d0 100644 
--- a/myfile.c 
+++ b/myfile.c 
@@ -100,12 +106,20 @@ int myioctl(unsigned int cmd, int size, int direction, unsigned long arg 
       rc = myfunc1(ioargp); 
       break; 

-  case IOCTL_1: 
-    rc = myfunc1(ioargp); 
+  case IOCTL_2: 
+    rc = myfunc2(arg); 
       break; 

有沒有一種方法,使grep的報告匹配的功能方面,類似git-diff(即在上面的例子中@@ int myioctl(...))?還是有一些替代工具的grep,其行爲像grep,但也會報告函數上下文?

我經常通過源代碼grep,知道包含匹配行的函數是很有幫助的,而不必打開文件並查找特定的模式或行號。

謝謝!

+0

請參閱:http://stackoverflow.com/questions/6133989/what-grep-command-will-include-the-current-function-name-in-its-output – Trevor

回答

1

這不完全可行,因爲我不認爲你可以使用正則表達式來表示所有形式的函數語句。你需要一個語法。

反正

所以,你有文件名

現在,你需要找出其中的匹配出現的行號。

grep -n "pattern" MYFILE | sed -r 's/([0-9]*):.*/\1/' 

你想知道什麼功能有上述

grep -n "pattern" MYFILE | sed -r 's/([0-9]*):.*/\1/' | while read lineNo 
do 
    head -n $lineNo MYFILE | tac | egrep -m 1 "[[:alnum:]]+[[:space:]]+[[:alnum:]](.*)[[:space:]]*{" 
done 

該印刷會給你的功能(希望),它包含其中匹配發生線路的名稱一致。
(我使用egrep的這樣我就可以使用'+' 操作符

注意,此模式匹配函數聲明,如下所示:

<function-type> <function-identifier> (<things>) { 

您需要擴展它以便它可以表示更多形式的函數聲明。

+0

我不一定有差異或git輸出,因爲我只是grepping文本(代碼)文件。我只是提供了git-diff作爲了解代碼上下文並提供包含相關「匹配」的函數定義的工具的示例。 ...基於上面的答案和其他答案的乾旱,我猜我應該閱讀git-diff源代碼並嘗試將它合併到grep中。 ...... :(......感謝您的建議:) – Trevor

+0

@Trevor哦,我完全誤解了這個問題。我以爲你使用的是git-diff,它並沒有提供給你函數名,所以你想這樣做。 – aec

+0

@Trevor無論哪種方式,你可以讓grep輸出行號,然後繼續我試圖爲你提供的內容。讓我知道你想出了什麼。聽起來像一個整潔的項目想法。 – aec