Cプログラムから(一部)コメントを削除する

Cプログラムから(一部)コメントを削除する

Cプログラムで、同じ行に開始(/*)と終了()があるが同じ行にコードがないコメントなど、古いスタイルのコメントの行全体を削除するには、bashスクリプトを使用する必要があります。*/以下はCプログラムの例です。

/* Comment 1 */
printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
            /* Comment 4 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7

ただし、次のように表示する必要があります。

printf("It is /* Comment 2 */\n");
 x = 5; /* Comment 3 */
 /* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7

すべてのコメントを削除する方法はわかっていますが、特定のコメントを削除する方法はわかりません。

スクリプトはテキストファイルから入力を読み取り、出力を別のファイルに書き込む必要があり、すべてのI / Oファイル名をコマンドラインに指定する必要があります。

答え1

これはsed移植可能です。

sed '\_^[[:blank:]]*/\*.*\*/[[:blank:]]*$_d' file.c

^ゼロ個以上の空白()で始まり[[:blank:]]*、コメントを開始し(/\*)、他の内容を含め(.*)、コメントを終了して(\*/)、スペースのみを含む残りの行()はすべて削除され[[:blank:]]*ますd。もちろんを使ってこれを行うこともできますgrep -v

これにより、次の項目も削除されます。

/* between two comments */ x = 0; /* could be some code */

答え2

これは以下に関連しています。フィリップスの答えとは別に

  • 正規表現の区切り記号として使用されます|(個人的な好み)。
  • 垂直タブ、フォームフィード、キャリッジリターン(スペースやタブを含む)などの非グラフィック文字を含みます。 Cはこれらの空白文字をすべて空白として扱うので、 [[:space:]]実際にC操作にはより良い文字クラスを使用します[[:blank:]]。パスワード。そして[[:space:]][[:space:]]
  • 同じ行に複数のコメントがある極端なケースを処理します。

sed '\|^[[:space:]]*/\*.*\*/[[:space:]]*$| { \|\*/.*[^[:space:]]|!d }'

Philipposの答えと同様に、行の空白ではなく最初の内容があること、行の空白ではない/* 最後の内容があるかどうかを確認します*/。これが真であれば、我々は解任された候補者を完全に見直すことができます。この場合は{...と入力して、空白以外の項目、つまり行の最後の空白以外の項目を} 探します。これを見つけると、最初のコメントの終わりが見つかり、その行に異なる内容があることがわかります。この場合は何もしないでください。もし私たちが*/*/いいえ*/行内でaを見つけて行を削除します。

答え3

sedコマンドを使用してテストし、正常に動作します。

注文する:

  sed -r "s/^\s+//g" filename| sed '/^\/\*.*\*\/$/d'

出力:

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
/*
* Comment 6
*/
// Comment 7

答え4

codeこれにより、コメント間の括弧の問題が解決されます。

sed  -E '/^\s*\/\*/!bx ; /\*\/\s*$/!bx ; /\*\/\s*\S+.*\/\*/bx ; d;  :x' draft 

行がスペースで始まるコメントタグで始まらない場合は、コードで始まるので elete をb過ぎてdx

/^\s*\/\*/!bx    

コメントで始まる行がコメントで終わらずに空白が出ている場合は、末尾にコードがあるので elete を次にb移動します。dx

/\*\/\s*$/!bx

最初の2つのテストは次のように組み合わせることができます。

/^\s*\/\*.*\*\/\s*$/!bx

コメント行に閉じるコメントタグがあり、その後に空白以外の文字が1つ以上あり、別のコメントが始まると内部にコードがあるのでbeletedを過ぎてx

/\*\/\s*\S+.*\/\*/bx

有効なコードが見つからなかったため削除されました。

d

それ以外の場合は何もせずに完了します。

x

テスト対象

/* Comment 1 */
printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
            /* Comment 4 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0;  /*some code */

出力は次のとおりです

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0; /*some code */

関連情報