2012-06-27 63 views
0

我一直在使用grepperl擴展名進行多行匹配。但事實證明,所有匹配的行號取決於第一個多行中的行數比賽 !錯誤的行號與多行grep -P [Perl擴展名]匹配

grep正則表達式來找到c功能啓動:

grep -iPn '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$' 

我可以解釋用一個例子更好:

假設源文件

 int f1(int a) {  

     int 
     f2 (int b)   
     { 

在這兩個函數存在在這種情況下,grep與regex成功匹配,輸出到stdout的行號與源文件的行號保持一致。

問題出現在多行函數第一次。這改變了行號輸出,並在檢查文件一段時間後,我得出了一個結論。多行函數是匹配的,但由grep單行讀取,因此它將整個函數分配給一個行號。函數後面的下一行根據行數「函數定義開始正則表達式」佔據。

在我的文件中有很多多行C函數,行號對它們中的每一個都太偏離。

有沒有辦法解決這個問題?

+1

是一個解決方案,它可以將整個文件讀入內存,然後再與之匹配嗎?換句話說,您的輸入文件不是很大嗎?我假設C源文件的大小合理,如果我們可以這樣做,更容易 – hobbs

+0

是的,合理的大小,但總是有一個限制。正如你所提到的'這個w唉'但是哪個? – Gil

回答

3

對同一個正則表達式使用pcregrep顯示正確的行數!

pcregrep -Mni '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$' 
0

您的解決方案無法與我的(linux,gnu)grep配合使用。

我需要添加-z才能使其工作。用-z「行」由空字符分隔;這樣你有一個單一的「線」,因此行號不會工作:(但字節偏移有時真的是足夠了...

所以,用grep:

grep -ziPbo '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$' 

獲得

24:int 
f2 (int b)   
{