2016-08-13 32 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文档工具套件也做得很好,但我发现它对我的需求有点矫枉过正。 –