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;
} |
所以在这段代码中,有两个主要变量: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, *p2,char y[10] ="a"。
希望得到答复。
- 这对于一个正则表达式来说是非常困难的。我是说真的很难。实际上,编写一个识别通用C变量声明的程序可能更容易,例如使用lex和yacc。
- bash、grep、sed、awk等都不是正确的工具。一种编程语言(除了一些外来的例外)具有复杂的词汇和语法结构,正如Joachim所提到的那样,完整的描述通常需要数十页专用语言,如lex和yacc。尝试对正则表达式执行同样的操作只是一个坏主意。
- 这就是我最初的想法。:(但是否可以通过将intchar和一些其他choosen数据类型用作grep中的或方法来对其进行grep?例如,我在cat file.c | grep int中给出了包含int的行的输出,但是如果我也要打印char的数据类型,我该如何处理:)
- 太好了@renaudpacalet,我对lex和yacc还没有经验,但现在就期待着它能用它来处理!
- 你可以用ctags来做这个工作。
- 这可能有帮助吗?stackoverflow.com/questions/6261392/&hellip;
- 另外:如果一个int或char是一个结构或联合体的一部分,您想做什么?
- 不只是初始化了@elyasin的变量。但是,如果您有一个结构或联合的解决方案,那么就不要共享:)
- C语言很复杂。用正则表达式捕捉每一个语法正确的变量声明/赋值是不可能的——再次阅读:不可能的。
- @Ingob&252;Rk Op需要int、char和double声明,因此使用regex进行声明会很困难且很长,但并非不可能(例如避免函数声明和字符串输入)。
- 声明可以跨行拆分,在声明之间有注释,使用宏,…
- 很好,投反对票的人能在这里提出一个理由吗?我用任何方法打开了那个问题类别。我希望这个问题不会太糟
- 你不能,你需要一个像cscope这样的语言解析器。这就是为什么存在这样的工具。
您可以使用grep的方法来查找以空格开头,后跟int或char的行,使用简单如下的基本正则表达式:
1 2 3 4
| $ grep '^[ ][ ]*\(int\|char\)' yourfile.c
int x = 99;
int *p1, *p2;
char y[10] ="a" |
如果有初始的tab字符(或混合的spaces和tabs字符),则可以使用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上也有许多其他您可能需要检查的内容。
解释(从评论)
举例来说,很明显只有int和char等。在空白之后被通缉(例如错过了int main ()号声明)。考虑到这一点,我们用基本正则表达式设置grep,要求在搜索项之前至少使用1(space使用bre),或者如果混合tab和space是可能的(使用pcre)。要仅处理空格,请使用BRE:
或者,如果处理混合空格和制表符,
它将搜索^锚定在行首,用bre查找带有字符类[ ]的space。为了处理至少一个空间,对于zero或更多附加spaces,我们添加一个附加[ ]*。
如果涉及多个(或混合)spaces和tabs(不能用bre轻松处理),PCRE基本上对space和tab执行相同的操作,同时牺牲了PCRE提供的扩展表达式处理的一些可移植性。^[ \t]+将在搜索词之前容纳one或more个space或tab字符的实例。要求在字符类中至少有1或更多字符匹配的+字符。
当查找int或char时,基本的正则表达式格式是
如果(和|在bre中不保留特殊含义,则必须在pcre形式简单时转义:
因此,总而言之,它只是锚定搜索一个或多个space(或使用pcre混合space和tab字符在int或char之前,以确定要显示的行。
希望有帮助。
- 很好。你能解释一下答案中的regex部分吗?因为如果我在任何其他C代码中使用相同的代码,它不会给出输出,我认为它是基于\t进行检查的。
- 适用于非常特定的集合,但函数参数声明和字符串("今天驱动一个字符"(来自加拿大的一个同事))。
- 是的,这是限量版的。对于更大的一般源解析,我发现cproto为收集所有函数、变量、定义等提供了一个很好的工具。源文件集合中的信息。IIRC,它是一个没有积极开发的包,但是源代码仍然可用。文档工具的doxygen套件也做得很好,但我发现它有点过分满足了我的需要。
- 哪个程序将[ \t]转换为空白制表符类?它不是外壳,而是在单引号内。我也不认为grep会做出这样的改变。
- 一个神奇的外壳——被Bre的\t解释炸飞了,添加了一个PCRE示例,并清理了Bre,谢谢。