いいですね。今やるべきことは、すべてのコメントブロックを次の形式に変換することです。
/**
*
*/
到着する:
/*!
*/
/**
ただし、定型句のライセンス形式を維持する必要があるため、次の行に「著作権」を含めることはできないことに注意することが重要です。
正規表現を使用すると簡単にできると思いますが、グループのキャプチャについてはよくわかりません。私は現在Perlで(悪い)解決策をハッキングしていますが、そこで適切に置き換える方法がわかりません。
編集:今は\/\*\*.*(?!Copyright)^\ *(?P<ast>\*).*(?=\*\/)//sm
、必要な機能がありますが、キャプチャされたグループだけをどのように変更しますか?
答え1
複雑さがわからない単一の正規表現は確かに作業を実行しますが、理解し維持するのがより簡単なのはおそらく1行ずつパーサーになります。ただし、明らかな注意事項は、コメントなどの文字列がコメントされていないコード部分では簡単に難読化される可能性があります(CPANにはこの言語の語彙アナライザがあるかもしれません)。解析::MGCちょっと正式なやり方でこれらのことをします。)
#!/usr/bin/env perl
use strict;
use warnings;
my @comment;
# read stuff from standard input or files on argument line, whatever
LINE: while (<>) {
# assume this is a comment, start saving lines
if (m{^\s*/\*\*}) {
push @comment, $_;
next LINE;
}
if (@comment) {
push @comment, $_;
# here things end, or so we hope...
if (m{^\s*\*/}) {
# not copyright means fixup of the saved comment block...
if ($comment[1] !~ m/Copyright/) {
$comment[0] =~ s{/\*\*}{/*!};
if (@comment > 2) {
for my $i (1..$#comment-1) {
$comment[$i] =~ s{^(\s*)\*(\s)}{$1 $2};
}
}
}
# emit and reset
print for @comment;
@comment = ();
}
next LINE;
}
# hopefully only not-comment lines
print;
}
答え2
コメントブロックが行の先頭にあると仮定すると(前にスペースがない/**
)、次のように動作できます。
#!/usr/bin/awk -f
/^\/[*][*] Copyright/ {print; next} # 1
/^\/[*][*]/ { flag = 1; sub("^/[*][*] ", "/*! ") } # 2
flag && /^ \* / { sub("^ [*]", " ") } # 3
/ [*]\// { flag = 0 } 1; # 4
(1)がある場合は、/** Copyright
印刷して次の行に移動します。 (2)他に何かがある場合は、/**
コメントブロックにあることを示すフラグを設定してに置き換えます/*!
。 (3) 対応するフラグが設定されている場合は、行の先頭からアスタリスクを削除します。 (4)コメントが終わると(*/
aが表示されている)フラグがクリアされ、1
最後の行が印刷されます。
テスト:
$ cat comments
/** foo
* bar
*/
* This isn't a comment
/** Copyright
* isn't changed
*/
$ awk -f strip.awk comments
/*! foo
bar
*/
* This isn't a comment
/** Copyright
* isn't changed
*/