例如,让我说我有这个代码
#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
语句,但我想严格打印这些行{{ 1}}和int x=99;
不每个行。
所以现在,在上面的问题中我也有一个变量数据类型int *p1, *p2
,现在我如何以char
之后的方式构建我的Bash脚本我只使用特定的数据类型cat
int
char
double
,是否有float
方法?或者有没有比cat和Grep更简单的方法来执行相同的操作?
所以我的最终输出应为OR
int x=99;
,int *p1, *p2
:)
期待回应。
答案 0 :(得分:1)
您可以使用grep
的方法查找以空格开头的行,然后使用基本正则表达式 int
或char
。为:
$ grep '^[ ][ ]*\(int\|char\)' yourfile.c
int x = 99;
int *p1, *p2;
char y[10] = "a"
如果您有初始tab
个字符(或混合spaces
和tabs
),则可以使用 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
和{{1在搜索词之前是可能的(使用 PCRE )。仅使用 BRE 处理空格:
space
或处理混合空格和制表符时,>> PCRE
grep '^[ ][ ]*
将搜索grep -P `^[ \t]+
固定在该行的开头,并使用 BRE 查找带有字符类的^
{ {1}}。要处理至少一个空格,并且对于space
或更多其他 [ ]
,我们会额外添加zero
。
如果涉及多个(或混合的)spaces
和[ ]*
(使用 BRE 无法轻松处理),则PCRE基本上对两个{{{ 1}}和spaces
,同时牺牲了PCRE提供的扩展表达式处理的一些可移植性。 tabs
将在搜索字词之前容纳space
或tab
个^[ \t]+
或one
个字符的实例。 more
要求字符类中的字符至少存在space
或更多匹配。
在查找tab
或+
时,基本正则表达式格式为
1
其中int
和char
在 BRE 中不具有特殊含义,并且必须在 PCRE 表格中进行转义:
\(int\|char\)
所以完全放在它之前,它只是固定搜索一个或多个(
(或使用 PCRE 混合|
和(int|char)
)字符space
或space
确定要显示的行。
希望有所帮助。