我在评论中继承了一些带有doxygen注释的C源代码。由于有点腐烂,\return
注释的一些注释现在是谎言,即函数已被转换为返回void,但\return
注释仍然存在并且另有说明。
示例:
/*!
* \brief The foo function
* \return OK if successful, ERROR otherwise
*/
void foo(void)
{
...
}
现在我想找到所有文件。我想过使用grep / sed / awk / perl查找\return
,然后打印以void
开头的下一行。一个简单的
grep -E '(\\return|^void)' file ...
还会打印来自非void函数的所有\return
个注释。如果看到\return
行,我确信只有 打印上一个^void
行的简单方法。
答案 0 :(得分:2)
如果您的所有功能及其前面的评论都遵循您发布的样式,那么这可能就是您所需要的:
awk '/\\return/{cmt=$0} /^[[:alpha:]]/{ if (/^void/ && cmt) print cmt ORS $0; cmt=""}' file
e.g:
$ cat file
/*!
* \brief The foo function
* \return OK if successful, ERROR otherwise
*/
void foo(void)
{
...
}
/*!
* \brief The bar function
* \return OK if successful, ERROR otherwise
*/
int bar(void)
{
...
}
$ awk '/\\return/{cmt=$0} /^[[:alpha:]]/{ if (/^void/ && cmt) print cmt ORS $0; cmt=""}' file
* \return OK if successful, ERROR otherwise
void foo(void)
答案 1 :(得分:1)
#! /usr/bin/env perl
use strict;
use warnings;
my $prev_return;
while (<>) {
# assume letter in first column introduces a function return type
if (my($return_type) = /^([^\W\d]\w*)/) {
if ($return_type eq "void" && defined $prev_return) {
print $prev_return;
}
undef $prev_return; # reset after each function definition
}
elsif (/\\return\b/) {
$prev_return = "$ARGV:$.: $_";
}
}
continue {
close ARGV if eof; # reset $. at the end of each named file
}
注意:模式[^\W\d]
使用double-negative technique来匹配不是数字的“单词字符”,即,字母和下划线。
示例输出:
$ cat file.c /*! * \brief The foo function * \return OK if successful, ERROR otherwise */ void foo(void) { ... } \return fdsklj void bar(void) void baz $ ./doxygen-return-void file.c file.c:3: * \return OK if successful, ERROR otherwise file.c:10: \return fdsklj
Perl的<>
,也称为菱形运算符,使编写Unix风格的过滤器变得容易。这意味着您可以根据需要命名多个路径。
$ ./doxygen-return-void file.c file.c file.c:3: * \return OK if successful, ERROR otherwise file.c:10: \return fdsklj file.c:3: * \return OK if successful, ERROR otherwise file.c:10: \return fdsklj
上面的程序也会消耗标准输入,但输出并不是非常有用。
$ cat file.c | ./doxygen-return-void -:3: * \return OK if successful, ERROR otherwise -:10: \return fdsklj