Удаление первых многострочных комментариев из всех * c файлов - PullRequest
0 голосов
/ 09 ноября 2011

У меня много c файлов в каталоге.Каждый файл начинается с многострочного комментария, как показано ниже, и начинается с include вроде

#include<stdio.h>. 

   // This is a c File

   // This File does sampling the frequency

   /* This uses the logic ...
   .....
   .....
   */

#include<stdio.h>

. Мне нужно удалить все строки комментариев в начале всех файлов .c, если они присутствуют.Некоторые файлы не будут иметь эти строки комментариев.В этом случае он не должен ничего делать.Это должно удалить только первые многострочные комментарии.Последующие многострочные комментарии должны быть такими, как есть.

Как это сделать в perl или shell?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Если вы уверены, что все файлы начинаются с включения, вы можете удалить все строки перед импортом:

perl -i -ne 'print if /^#include/..0' *.c
0 голосов
/ 09 ноября 2011

У меня было довольно простое решение, если бы #include можно было считать пробкой:

use strict;
use warnings;
use English qw<$RS>;
use English qw<@LAST_MATCH_START>;

*::STDIN = *DATA{IO};
my $old_rs = $RS;
local $RS = "*/";
local $_;

while ( <> ) { 
    if ( m{/[*](?:.(?!:[*]/))*\n(?sm-ix:.(?!:[*]/))*[*]/}m ) {
        substr( $_, $LAST_MATCH_START[0] ) = '';
        print;
        last;
    }
    print;
    last if m/^\s*#include\b/m;
}
$RS = $old_rs;
print while <>;

__DATA__
##include<stdio.h>. 

   // This is a c File

   // This File does sampling the frequency

   /* A mline comment not multi */

   /* This uses the logic ...
   .....
   .....
   */

#include<stdio.h>

Обратите внимание, что мне пришлось изменить начальный #include, чтобы скрипт работал. Мне показалось простым, что, если бы я хотел многострочных комментариев, самым простым решением было бы сделать '*/' моим разделителем записей, вместо того, чтобы делать много переключений на отдельных строках.

Но оглядываясь назад, требует буферизации и сделал грязное решение:

use strict;
use warnings;
use English qw<$RS>;
use English qw<@LAST_MATCH_START>;

*::STDIN = *DATA{IO};
my $old_rs = $RS;
local $RS = "*/";
local $_;

my ( $rin, $rie );
my $mline = '';
my $buffer;

while ( <> ) { 
    if ( m{/[*](?:.(?!:[*]/))*\n(?sm-ix:.(?!:[*]/))*[*]/}m ) {
        my $split = $LAST_MATCH_START[0];
        print substr( $_, 0, $split );
        $mline = substr( $_, $split );
        last;
    }
    print;
}
$RS = $old_rs;
while ( <> ) { 
    $buffer .= $_;
    if ( /^\s*#include\b/ ) { 
        $mline = '';
        last;
    }
}
print $mline, $buffer;
print while <>;

__DATA__
#include<stdio.h>. 

   // This is a c File

   // This File does sampling the frequency

   /* A mutli-line comment not on multiple lines */

   /* This uses the logic ...
   .....
   .....
   */

#include<stdio.h>
0 голосов
/ 09 ноября 2011
#!/usr/bin/env perl
use strict;
use warnings;
my $skipping = 0;
while (<>) {
    m{^\s*//}           and next;
    m{^\s*/\*.*\*/\s*$} and next;
    if ( m{^\s*/\*} ) {
        $skipping = 1;
        next;
    }
    if ( m{^\s*\*/} ) {
        $skipping = 0;
        next;
    }
    next if $skipping;
    print;
}

... или альтернативно:

#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
    next if      m{^\s*//};
    next if      m{^\s*/\*.*\*/\s*$};
    next while ( m{^\s*/\*}..m{^\s*\*/} );
    print;
}

... И если вы хотите сделать это только для первого многострочного комментария, измените разделители совпадений диапазона из фигурных скобокна "?"символ, читать следующим образом:

next while ( m?^\s*/\*?..m?^\s*\*/? );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...