【发布时间】:2015-10-14 20:27:15
【问题描述】:
我正在尝试制作“脚本”——本质上是一个 awk 命令——以在 .c 文件中提取 C 代码函数的原型,以自动生成头文件 .h。 我是 awk 的新手,所以我不了解所有详细信息。
这是源 .c 的示例:
dict_t dictup(dict_t d, const char * key, const char * newval)
{
int i = dictlook(d, key);
if (i == DICT_NOT_FOUND) {
fprintf(stderr, "key \"%s\" doesn't exist.\n", key);
dictdump(d);
}
else {
strncpy(d.entry[i].val, newval, DICTENT_VALLENGTH);
}
return d;
}
dict_t* dictrm(dict_t* d, const char * key) {
int i = dictlook(d, key);
if (i == DICT_NOT_FOUND) {
fprintf(stderr, "key \"%s\" doesn't exist.\n", key);
dictdump(d);
}
else {
d->entry[i] = d->entry[--d.size];
}
if ( ((float)d->size)/d.maxsise < 0.25 ) {
d->maxsize /= 2;
d->entry = realloc(d->entry, d->maxsize*sizeof(dictent_t*));
}
return d;
}
以及我想要生成的内容:
dict_t dictup(dict_t d, const char * key, const char *newval);
dict_t* dictrm(dict_t* d, const char * key);
我的带有完整正则表达式的命令如下所示:
awk '/^[a-zA-Z*_]+[:space:]+[a-zA-Z*_]+[:space:]*\(.*?\)/{ print $0 }' dict3.c
但我对此一无所知。 所以我试着挤压它,看看我能不能带来一些东西。 我试过这个:
awk '/^[a-zA-Z*_]+[:space:]+[a-zA-Z*_]+/{ print $0 }' dict3.c
我明白了:
dictent_t* dictentcreate(const char * key, const char * val)
dict_t* dictcreate()
dict_t* dictadd(dict_t* d, const char * key, const char * val)
dict_t dictup(dict_t d, const char * key, const char * newval)
dict_t* dictrm(dict_t* d, const char * key) {
它是许多奇迹的源泉!
- 为什么第一个正则表达式不起作用?
- 为什么第二个捕获了一些声明,但不是全部?我向你保证,任何声明之前都没有空格。我猜它没有捕捉到代码的其他部分,比如变量声明,因为缩进。
- 第三个问题,为什么它抓住了我只需要表达式的所有行?
- 最后一个,如何在每个正则表达式的末尾添加
;?
【问题讨论】:
-
尝试删除
[:space:]+并添加`+`(空格+) -
@EdMorton 我是这么认为的,但快速测试(因为我分心)表明这有所帮助,但这可能只是因为我没有注意并且其他事情都错了。
标签: regex awk header-files text-extraction