我有几个不同文件的C结构。其中一些被指定为打包,有些则不是。像这样:
pscp name@example.com:/home/www/file c:\xampp\htdocs
我想获得仅包装结构的结构名称列表。对于上面的代码,其中包括typedef struct foo_s {
uint32 foo_field_1;
uint64 foo_field_2;
} foo_t;
typedef struct bar_s {
uint32 bar_field_1;
uint64 bar_field_2;
} __packed bar_t;
,但不包括bar_s
。
我写了一个像这样的Perl单行程,似乎让我大部分都在那里:
foo_s
问题在于,对于上面的结构,这实际上返回foo_s,因为它最初匹配perl -0777 -ne 'while(m/typedef struct (\w+) {\n(?:.*\n)*?} __packed \w+;/g){print "$1\n";}' <filename>
,然后继续直到匹配typedef struct foo_s {
。
我尝试使用lookbehind返回并找到} __packed bar_t
的最新匹配,只要找到typedef struct
,但不支持可变长度的lookbehind。
有没有办法用Perl中的正则表达式处理这个问题?理想情况下,每次找到它时都会匹配__packed
,然后如果找到typedef struct <name>
,则打印出最近匹配的结构名称&#34;。< / p>
如果可以,我想避免编写解析器。
谢谢!
答案 0 :(得分:4)
$ perl -0777 -nE 'say $1 while m/typedef struct (\w+) \{[^}]+\} __packed \w+;/g' file
bar_s
此处的密钥为\{[^}]+\}
,以匹配没有“内部”关闭括号的支撑块。