C 風のコメントを削除

ファイルの先頭のコメントを除去するスクリプト - みずぴー日記にインスパイヤされて、C 風のコメントを削除してみます。

実際には中身をパースしないと、printf 文の中に入っているものも該当しかねないので、あくまでサンプルという位置づけです。

#! /usr/local/bin/nawk -f
# strip_comment.awk
# C 風のコメントの削除
# usage: nawk -f strip_comment.awk file

/\/\**/ && !/\*\// {
    block_comment = 1;
    $0 = "";
}

block_comment && !/\*\// {
    $0 = "";
}

block_comment && /\*\// {
    block_comment = 0;
    $0 = "";
}

{
    gsub(/\/\*.*?\\*\//, "");

    print $0;
}

一応、1 行コメントとブロックコメントに対応しています。 ファイルの先頭のコメントを除去するスクリプト - みずぴー日記のように行を連結させることでブロックコメントを探すこともできますが、awk の正規表現は最長一致のため、ゴッソリ消されてしまうことがありますので、注意が必要です。

$ cat sample.c
/*
 * これはコメント
 */

#include <stdio.h>

/* これもコメント */

int main() {
    printf("Hello world.\n"); /* これもコメント */

    return 0;
}

$ nawk -f strip_comment.awk sample.c




#include <stdio.h>



int main() {
    printf("Hello world.\n");

    return 0;
}

同じような問題は awk 界隈で何度も議論されていますが、そう簡単なものではありません。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png