【问题标题】:Finding Variables of a C File using Grep使用 Grep 查找 C 文件的变量
【发布时间】:2016-08-13 07:03:50
【问题描述】:

例如,假设我有这个代码

#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 特定的数据类型,如 int @ 987654333@doublefloat,有没有OR的方法呢?或者有没有比 cat 和 Grep 更简单的方法来执行相同的操作??

所以我的最终输出应该是 int x=99; int *p1, *p2 , char y[10] = "a" :)

期待回复。

【问题讨论】:

  • 用一个正则表达式很难做到这一点。我的意思是真的很难。实际上,编写一个识别通用 C 变量声明的程序可能更容易,例如使用lexyacc
  • bashgrepsedawk 等不是执行此操作的正确工具。正如 Joachim 所提到的,一种编程语言(除了一些特殊的例外)具有复杂的词汇和语法结构,其完整描述通常需要数十页专用语言,如 lexyacc。尝试对正则表达式做同样的事情是个坏主意。
  • 您可以使用ctags 完成这项工作
  • C 语言很复杂。这是不可能的——再读一遍:不可能——通过使用正则表达式来捕获每个语法正确的变量声明/赋值。
  • 声明可以跨行拆分,中间有 cmets,使用宏,...

标签: c bash shell variables grep


【解决方案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 of

grep -P `^[ \t]+

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

如果涉及多个(或混合)spacestabs(使用 BRE 无法轻松处理),PCRE 对 space 和 @987654348 基本上做同样的事情@,同时牺牲了 PCRE 提供的扩展表达式处理的一些可移植性。 ^[ \t]+ 将在 搜索词 之前容纳 spacetab 字符的 onemore 实例。 + 要求至少存在1更多 匹配字符类中的字符。

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

\(int\|char\)

其中(|BRE 中不保留特殊含义,并且必须在PCRE 形式简单时进行转义:

(int|char)

因此,总而言之,它只是在int 或@987654366 之前锚定搜索一个或多个space(或使用PCRE 混合spacetab)字符@决定显示哪些行。

希望有所帮助。

【讨论】:

  • 不错。您能否解释一下答案中的正则表达式部分。因为如果我在任何其他 C 代码中使用相同的代码,它不会给出输出,我认为它是基于 \t 进行检查。
  • 适用于非常具体的集合,但函数参数声明和字符串(“今天驱动一个字符”(来自加拿大研究员))...
  • 是的,这是限量版。对于较大的通用源解析,我发现cproto 提供了一个很好的工具来收集所有 functionvariable#define 等。 . 来自源文件集合的信息。 IIRC,它是一个没有积极开发的包,但源代码仍然可用。 Doxygen 文档工具套件也做得很好,但我发现它对我的需求有点过头了。
  • 哪个程序将[ \t] 转换为空白制表符字符类?这不是壳;它在单引号内。我也不认为grep 会做出这样的改变。
  • 一个神奇的外壳 - 使用 BRE\t 解释正确,添加了一个 PCRE 示例并清理了 BRE,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 2011-08-07
相关资源
最近更新 更多