コメント行を削除する sed スクリプト

SQLスクリプトからコメント・空行を削除するsedスクリプトを示す。
これを応用すれば、他の言語に適用可能。

実行例

sample.txtに含まれるSQLコメントを削除する。
コメント削除後に wc -l 実行して、ステップ数を計算させている。 工数見積もりする時に使えるかも。

 1$ cat sample.txt
 2/* comment */
 3command1
 4
 5/***********
 6 * comment *
 7 ***********/
 8command2
 9
10/*
11 * comment
12 */
13command3
14
15-- comment
16command4
17
18$ cat sample.txt |
19> gsed '/\/\*/{:top; /\*\//!{N;btop}; s@/\*.*\*/@@}; s@--.*@@; /^[ \t]*$/d'
20command1
21command2
22command3
23command4
24$
25$
26$ cat sample.txt |
27> gsed '/\/\*/{:top; /\*\//!{N;btop}; s@/\*.*\*/@@}; s@--.*@@; /^[ \t]*$/d' |
28> wc -l
29       4
30$

sed スクリプト

GNU sed の場合

'/\/\*/{:top; /\*\//!{N;btop}; s@/\*.*\*/@@}; s@--.*@@; /^[ \t]*$/d'

BSD sed の場合は、以下のように GNU の場合の ; の部分で改行すれば動く。

'
/\/\*/{
  :top
  /\*\//!{
    N
    btop
  }
  s@/\*.*\*/@@
}
s@--.*@@
/^[ \t]*$/d
'

解説

SQLのコメントは以下の2パターン。
/**/で挟まれた部分
--から始まり行末までの部分

処理の流れは、上記2パターンにマッチする部分を削除 → 続いて空行を削除、となる。
sed スクリプトを分解して考える。

  1. /**/で挟まれた部分を削除
    スクリプト内の /\/\*/{:top; /\*\//!{N;btop}; s@/\*.*\*/@@} が該当処理。
    /*が見つかったら、*/が見つかるまで次行をパターンスペースの後ろに追加。 パターンスペースに/**/が含まれた時点で、削除置換を実行する
    ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
    パターンスペースに/*を含んでいる場合 (アドレス /\/\*/ の部分に該当)
    ラベル「top」の設定
    パターンスペースに*/を含んでいない場合 ( アドレス /\*\//! の部分に該当)
    N コマンドにより、パターンスペースの末尾に次行を読み込んで追加
    ラベル「top」に分岐
    パターンスペースの/*から*/までを削除置換する (s@/\*.*\*/@@ の部分に該当)
    ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  2. --から始まり行末までを削除
    スクリプト内の s@--.*@@ が該当処理。

  3. 空行を削除
    スクリプト内の /^[ \t]*$/d が該当箇所。
    空白やタブだけで構成されている行も削除する。
    Windows環境からLinux環境にアップロードしたテキストファイルの場合は、末尾に\rが残っているかもしれないので、ブラケット内を[ \t\r]とするのがベターかもしれない。

関連ページ