关于bash:使用Grep查找C文件的变量

Finding Variables of a C File using Grep

例如,假设我有这个代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

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

    return 0;

}

所以在这段代码中,有两个主要变量:intchar类型。现在,假设我编写了一个至少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"

希望得到答复。


您可以使用grep的方法来查找以空格开头,后跟intchar的行,使用简单如下的基本正则表达式:

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

如果有初始的tab字符(或混合的spacestabs字符),则可以使用Perl兼容的正则表达式:

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

我不知道这是否正是你想要的,如果不是,请告诉我。还有其他的C代码扫描器可以将变量、函数等提取出来并进行总结,例如,cproto是我经常使用和喜欢的扫描器。在sourceforge上也有许多其他您可能需要检查的内容。

解释(从评论)

举例来说,很明显只有intchar等。在空白之后被通缉(例如错过了int main ()号声明)。考虑到这一点,我们用基本正则表达式设置grep,要求在搜索项之前至少使用1(space使用bre),或者如果混合tabspace是可能的(使用pcre)。要仅处理空格,请使用BRE:

1
grep '^[ ][ ]*

或者,如果处理混合空格和制表符,

1
grep -P `^[ \t]+

它将搜索^锚定在行首,用bre查找带有字符类[ ]space。为了处理至少一个空间,对于zero或更多附加spaces,我们添加一个附加[ ]*

如果涉及多个(或混合)spacestabs(不能用bre轻松处理),PCRE基本上对spacetab执行相同的操作,同时牺牲了PCRE提供的扩展表达式处理的一些可移植性。^[ \t]+将在搜索词之前容纳onemorespacetab字符的实例。要求在字符类中至少有1或更多字符匹配的+字符。

当查找intchar时,基本的正则表达式格式是

1
\(int\|char\)

如果(|在bre中不保留特殊含义,则必须在pcre形式简单时转义:

1
(int|char)

因此,总而言之,它只是锚定搜索一个或多个space(或使用pcre混合spacetab字符在intchar之前,以确定要显示的行。

希望有帮助。