c - 使用 Grep 查找 C 文件的变量

标签 c bash shell variables grep

例如,假设我有这段代码

#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 而不是 Every 行。

现在,在上面的问题中,我也有一个变量数据类型char,现在我如何以cat之后的方式构建我的Bash脚本我grep仅特定数据类型,例如int char double float,是否有任何OR有方法吗?或者有没有比 cat 和 Grep 更简单的方法来执行相同的操作?

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

期待您的回复。

最佳答案

您可以使用 grep 来查找以空格开头,后跟 intchar 的行,使用基本正则表达式就像这样简单:

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

如果您有初始 tab 字符(或混合 空格tab),您可以使用 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 至少需要 1 (space 使用 BRE),或者如果是混合 搜索词之前可以使用 tabspace(使用 PCRE)。仅处理空格,使用 BRE:

grep '^[ ][ ]*

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

grep -P `^[ \t]+

将搜索^锚定在行的开头,并使用BRE查找带有字符的空格 []。为了处理至少一个空格,对于或更多额外空格,我们添加一个额外的[ ]* .

当涉及多个(或混合)空格制表符(无法使用BRE轻松处理)时,PCRE本质上会执行以下操作:对于 spacetab 来说都是一样的,同时牺牲了 PCRE 提供的扩展表达式处理的一些可移植性。 ^[\t]+ 将容纳一个更多spacetab实例搜索词之前的 > 字符+ 要求字符类中的字符至少存在 1更多 个匹配项。

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

\(int\|char\)

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

(int|char)

所以把它放在一起,它只是锚定一个或多个 space 的搜索(或使用 PCRE 混合 space tab)在 intchar 之前的字符来确定要显示的行。

希望有所帮助。

关于c - 使用 Grep 查找 C 文件的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38930169/

相关文章:

linux - 如何杀死一个 shell 脚本和它创建的进程?

c - c中枚举的使用

c++ - 向数学解析器添加条件和函数

c++ - 实现安全左移

windows - Perl:与 Unix 相比,Windows 中的奇怪 Tie::File 行为

http - 远程(Http)文件更改时如何执行操作?

c - 如何使用GDB调试多线程程序?

arrays - 如何将线中的元素存储到数组中?

php - 使用 REQUEST_METHOD ="POST"从 C++ 调用 php-cgi

git 输出为空白,除非在 : echo "$(git branch)" 中捕获