例如,假设我有这段代码
#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
而不是 Every 行。
现在,在上面的问题中,我也有一个变量数据类型char
,现在我如何以cat
之后的方式构建我的Bash脚本我grep仅特定数据类型,例如int
char
double
float
,是否有任何OR
有方法吗?或者有没有比 cat 和 Grep 更简单的方法来执行相同的操作?
所以我的最终输出应为 int x=99;
int *p1, *p2
, char y[10] = "a"
:)
期待您的回复。
最佳答案
您可以使用 grep
来查找以空格开头,后跟 int
或 char
的行,使用基本正则表达式就像这样简单:
$ 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 上还有许多其他内容,您可能还想查看。
说明(来自评论)
根据示例,很明显,在空白之后只需要 int
、char
等(例如错过 int main ()
声明)。考虑到这一点,我们使用基本正则表达式设置 grep 至少需要 1
(space
使用 BRE),或者如果是混合 搜索词之前可以使用 tab
和 space
(使用 PCRE)。仅处理空格,使用 BRE:
grep '^[ ][ ]*
或者如果处理混合空格和制表符,PCRE为
grep -P `^[ \t]+
将搜索^
锚定在行的开头,并使用BRE查找带有字符的空格
类 []
。为了处理至少一个空格,对于零
或更多额外空格
,我们添加一个额外的[ ]*
.
当涉及多个(或混合)空格
和制表符
(无法使用BRE轻松处理)时,PCRE本质上会执行以下操作:对于 space
和 tab
来说都是一样的,同时牺牲了 PCRE 提供的扩展表达式处理的一些可移植性。 ^[\t]+
将容纳一个
或更多
个space
或tab
实例搜索词之前的 > 字符。 +
要求字符类中的字符至少存在 1
或 更多 个匹配项。
当查找int
或char
时,基本的正则表达式格式是
\(int\|char\)
其中 (
和 |
在 BRE 中不保留特殊含义,并且必须在 PCRE 中转义形式很简单:
(int|char)
所以把它放在一起,它只是锚定一个或多个 space
的搜索(或使用 PCRE 混合 space
和 tab
)在 int
或 char
之前的字符来确定要显示的行。
希望有所帮助。
关于c - 使用 Grep 查找 C 文件的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38930169/