2010-04-22 41 views
9

當搜索字符串的代碼時,我經常遇到問題,我得到毫無意義的,上下文無關的結果。例如,如果一個函數調用被拆分爲3行,並且我搜索參數的名稱,那麼我自己獲取該行的參數,而不是該函數的名稱。我該如何grep整個可能包裝的代碼行?

例如,在含有

... 
    someFunctionCall ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

grepping爲MY_CONSTANT都將返回一個看起來像這樣的線的文件:

    MY_CONSTANT, 

同樣地,在註釋塊:

///////////////////////////////////////// 
// FIXMESOON, do..while is the wrong choice here, because 
// it makes the wrong thing happen 
///////////////////////////////////////// 

修復FIXMESOON給出了非常令人沮喪的答案:

// FIXMESOON, do..while is the wrong choice here, because 

當有成千上萬的命中時,單行結果有點沒有意義。我想要做的就是讓grep知道源代碼行的起點和終點,就像考慮「;」一樣簡單。因爲線路分隔將是一個好的開始。

獎勵分數,如果你可以使它返回整個評論塊,如果命中是在評論中。

我知道你不能單獨使用grep來做到這一點。我也意識到可以讓grep返回一定數量的上下文。有關如何在Linux下完成的任何建議?僅供參考我的首選語言是C和Perl。

我確信我可以寫點東西,但我知道有人必須已經做到了。

謝謝!

+3

不知道,但它是一個很好的問題! – mpen 2010-04-22 04:49:40

+1

代替一個好的解決方案,你總是可以使用grep的'-C n'作爲上下文的'n'行 – 2010-04-22 05:08:57

回答

3

您可以使用帶-M選項的pcregrep(多行匹配; pcregrep是帶Perl兼容正則表達式的grep)。喜歡的東西:

pcregrep -M ";*\R*.*thingtosearchfor*\R*.*;.*" 
+0

酷,不知何故不知道pcregrep。喜歡使用提示:'用法:pcregrep [-ABCcDdeFfHhilLMNnoqrsuVvwx] [長選項] [模式] [文件]'。總是很高興知道哪些字符是有效的選項! – Cascabel 2010-04-22 05:10:11

+0

... *是啊,選項膨脹,有什麼樂趣。 – 2010-04-22 05:11:42

+0

@wash - 什麼選項膨脹???他們仍然有20個字符未使用! – DVK 2010-04-22 05:14:59

1

您可以使用grep編寫一個命令行,其中包含給出行號和文件名的選項,然後將這些結果xarg解析爲這些列,然後使用您的小腳本顯示圍繞該行的N行線? :)

1

如果這不是一個學術的努力,你可以只使用cscope(對於C代碼只雖然)。如果你願意放棄在搜索註釋ctags的要求應該是足夠的(並且它也支持Perl)。

3

這裏是一個使用awk的例子。

$ cat file 
blah1 
blah2 
    function1 ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

function2(one , two) 
blah3 
blah4 

$ awk -vRS=")" '/function1/{gsub(".*function1","function1");print $0RT}' file 
function1 ("test", 
        MY_CONSTANT, 
        (some *really) 

背後的概念:RS是記錄分隔符。通過設置爲「)」,那麼文件中的每個記錄都用「)」分隔,而不是換行符。這可以很容易找到你的「function1」,因爲你可以「grep」。如果您不使用awk,則可以使用「)」上的「分割」應用相同的概念。

0

我有一種情況,我有一個xml文件,裏面全是xml樣式格式的壓縮文件的名稱,也就是說,用胡蘿蔔括起文件的名字,例如。拉鍊< \東西>

我用awk來改變所有胡蘿蔔切成換行符然後使用grep的:)