如何将模式与多行匹配并显示它们?

时间:2012-07-05 20:24:27

标签: c regex grep

我有一个头文件(.h),其中包含C中结构的定义。

有些定义如下:

typedef struct {
 ...
 ...
 ...
} structure1

有些定义如下:

typedef struct structure2 {
 ...
 ...
 ...
} structure2

和一些命令结构定义: 有些定义如下:

//typedef struct {
// ...
// ...
// ...
//} structure1

如何使用egrep或更多unix命令查找头文件中的所有结构并打印所有结构名称?

感谢名单。

1 个答案:

答案 0 :(得分:0)

使用perl非常容易:

perl -e 'local $/; $_ = <>; print $1."------\n" while (/(typedef struct {.*?}.*?\n)/msg);'

示例:

$ cat /tmp/1.txt 
typedef struct {
 ...
 ...
 ...
} structure1

hello

typedef struct {
 ...
 ...
 ...
} structure2

bye

$ cat /tmp/1.txt | perl -e 'local $/; $_ = <>; print $1."------\n" while (/(typedef struct {.*?}.*?\n)/msg);'
typedef struct {
 ...
 ...
 ...
} structure1
------
typedef struct {
 ...
 ...
 ...
} structure2
------

---------分隔的成立区块。

如果您只想获取结构的名称,则必须将正则表达式的另一部分分组(使用()对所需的部分进行分组):

$ cat /tmp/1.txt | perl -e 'local $/; $_ = <>; print $1."\n" while (/typedef struct {.*?}\s*(.*?)\n/msg);'
structure1
structure2

如您所见,我稍微修改了正则表达式:

/typedef struct {.*?}\s*(.*?)\n/

}之后的字符串部分将被捕获到组$1中。