コメント行を削除する 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 スクリプトを分解して考える。
/*
と*/
で挟まれた部分を削除
スクリプト内の/\/\*/{:top; /\*\//!{N;btop}; s@/\*.*\*/@@}
が該当処理。/*
が見つかったら、*/
が見つかるまで次行をパターンスペースの後ろに追加。 パターンスペースに/*
と*/
が含まれた時点で、削除置換を実行する
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
パターンスペースに/*
を含んでいる場合 (アドレス/\/\*/
の部分に該当)
ラベル「top」の設定
パターンスペースに*/
を含んでいない場合 ( アドレス/\*\//!
の部分に該当)
N コマンドにより、パターンスペースの末尾に次行を読み込んで追加
ラベル「top」に分岐
パターンスペースの/*
から*/
までを削除置換する (s@/\*.*\*/@@
の部分に該当)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆--
から始まり行末までを削除
スクリプト内のs@--.*@@
が該当処理。空行を削除
スクリプト内の/^[ \t]*$/d
が該当箇所。
空白やタブだけで構成されている行も削除する。
Windows環境からLinux環境にアップロードしたテキストファイルの場合は、末尾に\rが残っているかもしれないので、ブラケット内を[ \t\r]
とするのがベターかもしれない。