我有一个从其他地方复制的C文件,但它有很多如下注释:
int matrix[20];
/* generate data */
for (index = 0 ;index < 20; index++)
matrix[index] = index + 1;
/* print original data */
for (index = 0; index < 5 ;index++)如何删除由/*和*/包围的所有注释。有时,注释由4-5行组成,我需要删除所有这些行。
基本上,我需要删除/*和*/之间的所有文本,甚至\n也可以介于两者之间。请使用sed、awk或perl中的一个来帮助我完成此操作。
发布于 2009-11-11 22:38:06
为什么不使用c预处理器来做这件事呢?为什么要把自己限制在一个自家生产的正则表达式中?
编辑此方法还可以干净利落地处理Barts printf(".../*...")方案
示例:
[File: t.c]
/* This is a comment */
int main () {
/*
* This
* is
* a
* multiline
* comment
*/
int f = 42;
/*
* More comments
*/
return 0;
}。
$ cpp -P t.c
int main () {
int f = 42;
return 0;
}或者,您可以删除空格并压缩所有内容
$ cpp -P t.c | egrep -v "^[ \t]*$"
int main () {
int f = 42;
return 0;
}重新发明轮子是没有用的,不是吗?
编辑如果您不想通过此方法展开包含的文件和宏,cpp会为此提供标志。考虑一下:
文件: t.c
#include <stdio.h>
int main () {
int f = 42;
printf(" /* ");
printf(" */ ");
return 0;
}。
$ cpp -P -fpreprocessed t.c | grep -v "^[ \t]*$"
#include <stdio.h>
int main () {
int f = 42;
printf(" /* ");
printf(" */ ");
return 0;
}有一点需要注意的是,可以避免宏扩展,但会从源代码中剥离宏的原始定义。
发布于 2009-11-11 19:19:21
参见perlfaq6。这是一个相当复杂的场景。
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
print;一句警告--一旦你这样做了,你有没有一个测试场景来证明你只是删除了评论,没有什么有价值的东西?如果您正在运行如此强大的regexp,我将确保某种类型的测试(即使您只是记录之前/之后的行为)。
发布于 2009-11-11 20:14:12
看一看strip_comments routine in Inline::Filters
sub strip_comments {
my ($txt, $opn, $cls, @quotes) = @_;
my $i = -1;
while (++$i < length $txt) {
my $closer;
if (grep {my $r=substr($txt,$i,length($_)) eq $_; $closer=$_ if $r; $r}
@quotes) {
$i = skip_quoted($txt, $i, $closer);
next;
}
if (substr($txt, $i, length($opn)) eq $opn) {
my $e = index($txt, $cls, $i) + length($cls);
substr($txt, $i, $e-$i) =~ s/[^\n]/ /g;
$i--;
next;
}
}
return $txt;
}https://stackoverflow.com/questions/1714530
复制相似问题