5

sed を使用して、ソース ファイル内のすべての C スタイル コメントを C++ スタイルに置き換えるにはどうすればよいですか。

これらすべて:

int main() {
  /* some comments */
  ...

に:

int main() {
  // some comments
  ...

すべてのコメントは 1 行で、次のようなコードの間にコメントはありません。

int f(int x /*x-coordinate*/ );

だから私はこれを試しました:

 sed -i 's/ \/\* .*  \*\ / \/\/* /g' src.c

ただし、ファイルは変更されません。 この投稿は似ていますが、sed の式構文を理解しようとしています。以来 "。" は任意の文字に一致し、「 * 」は 0 個以上のパターンに一致します。「.*」は任意の文字の任意の数に一致すると仮定します。

4

1 に答える 1

6
sed -i 's:\(.*\)/[*]\(.*\)[*]/:\1 // \2:' FILE

これにより、各行が次のように変換されます。

aaa  /* test */

次のような行に:

aaa  // test

同じ行にさらにコメントがある場合は、次のような行を変換するこのより洗練されたパーサーを適用できます。

aaa /* c1 */ bbb /* c2 */ ccc

の中へ

aaa  bbb ccc // c1 c2

sed -i ':r s:\(.*\)/[*]\(.*\)[*]/\(.*\):\1\3 //\2:;tr;s://\(.*\)//\(.*\)://\2\1:;tr' FILE

より洗練されたケースは、 のように、行の文字列内にコメントがある場合ですcall("/*string*/")c-comments.sedこの問題を解決するスクリプトは次のとおりです。

s:\(["][^"]*["]\):\n\1\n:g
s:/[*]:\n&:g
s:[*]/:&\n:g
:r
s:["]\([^\n]*\)\n\([^"]*\)":"\1\2":g
tr
:x
s:\(.*\)\n/[*]\([^\n]*\)[*]/\n\(.*\)$:\1\3 // \2:
s:\(.*\)\n\(.*\)//\(.*\)//\(.*\):\1\n\2 //\4\3:
tx
s:\n::g

このスクリプトを c-comments.sed ファイルに保存し、次のように呼び出します。

sed -i -f c-comments.sed FILE
于 2012-07-30T22:05:49.930 に答える