2016-08-13 54 views
-2

C文件的變量例如比方說,我有這樣的代碼發現用grep

#include <stdio.h> 

int main(void) 
{ 
    int x = 99; 
    int *p1, *p2; 
    char y[10] = "a" 
    // some code 
    // some code 

    return 0; 

} 

所以在這段代碼中,有兩個變量主要int類型和char的。現在,假設我編制了至少400-500行的代碼,其中我已經初始化了20-30個變量。現在,我想創建一個bash腳本來查找代碼中的變量。我用這種方式cat code.c | grep int開始,這將打印int main void()功能在上面給定的情景,並打印int x =99//some code聲明,但我希望只打印這些行int x=99;int *p1, *p2線。

所以現在,在這裏上面的問題,我有一個變量數據類型char過,現在我該怎樣構建我的bash腳本的方式,cat後,我用grep只有特定的數據類型一樣intchardoublefloat,有任何OR它的方法?還是有沒有比貓和Grep更容易執行相同的方法?

所以我的最終輸出應int x=99;int *p1, *p2char y[10] = "a" :)

將是前瞻性的反應。

+1

這對於單個正則表達式來說確實很難做到。我的意思是***真的很難。編寫一個識別泛型C變量聲明的程序實際上可能會更容易,例如使用'lex'和'yacc'。 –

+1

'bash','grep','sed','awk'等都不是正確的工具。一種編程語言(有一些奇特的例外)具有複雜的詞法和語法結構,如Joachim所提到的,完整的描述經常需要數十頁專用語言,如'lex'和'yacc'。試圖用正則表達式做同樣的事情只是一個壞主意。 –

+0

這就是我最初想到的@JoachimPileborg。 :(但是,可以通過在grep中使用它作爲OR方法來grep'int'' char'和其他一些選擇數據類型嗎?例如我做了'cat file.c | grep int'給出了包含行的輸出'int'但如果我想要打印'char'數據類型,我該如何繼續:) –

回答

1

您可以採取的方式與grep找到之後intchar與空格開頭的行使用基本正則表達式用簡單的東西如:

$ grep '^[ ][ ]*\(int\|char\)' yourfile.c 
int x = 99; 
int *p1, *p2; 
char y[10] = "a" 

如果你有初始tab字符, (或混合spacestabs),您可以使用Perl兼容正則表達式

$ grep -P '^[ \t]+(int|char)' yourfile.c 
int x = 99; 
int *p1, *p2; 
char y[10] = "a" 

我不知道這是不是你正在尋找的,如果沒有,請告訴我。還有其他的C代碼掃描儀可以將變量,功能等抽出並彙總,例如cproto是我用過並喜歡的一個。 sourceforge上還有一些其他的可能需要檢查。

解釋(從評論)

給出的例子,很明顯,只有intchar,等被通緝後的空格(如錯過int main()聲明)。考慮到這一點,我們建立的grep與基本正則表達式至少需要1space使用BRE)或者混合tabspace都是可能的搜索詞前(使用PCRE)。爲只處理空間,具有BRE

grep '^[ ][ ]* 

,或者如果處理混合空格和製表符,一個PCRE的

grep -P `^[ \t]+ 

這在行的開頭錨搜索^並與BRE尋找space字符類別[ ]。要處理至少一個空間,並且對於zero或更多額外的spaces,我們添加額外的[ ]*

處理提供

在多個(或混合)spacestabs涉及(其不能與BRE容易處理),則PCRE基本上確實爲既spacetab同樣的事情,而犧牲一些可移植性爲展開表達式由PCRE。 ^[ \t]+將容納onemore個例spacetab個字符搜索字詞之前的字符。 +要求存在至少1更多匹配字符類中的字符。

當尋找任何intchar,基本的正則表達式的格式是

\(int\|char\) 

其中(|不以BRE保留特殊的含義,必須進行轉義而PCRE形式簡單地說:

(int|char) 

所以把它完全放在一起,它只是一個簡單的在intchar之前,確定要顯示哪些行,搜索一個或多個space(或使用PCRE混合spacetab)個字符。

希望有幫助。

+0

不錯。你能解釋答案中的正則表達式部分嗎?因爲如果我使用相同的任何其他C代碼它不會給出輸出,我認爲這是基於'\ t'檢查。 –

+0

將工作的一個非常具體的設置,但功能參數聲明和字符串(「今天驅動一個字符」(來自加拿大研究員))... –

+0

是的,這是一個有限的設置。對於較大的通用源代碼解析,我發現'cproto'提供了一個很好的工具來收集源文件集合中的所有*函數*,*變量*,* #define *等等信息。 IIRC,這是一個沒有積極開發的軟件包,但資源仍然可用。 Doxygen文檔工具套件也做得很好,但我發現它對我的需求有點矯枉過正。 –