BLOG & TOOLS
© 2018 yanohirota.com

【正規表現】条件に一致した行を削除する

信じがたいことに、世の中には何万行もあるテキストファイルなんてのが存在する。そして世の中には、その何万行をひたすら読まなくてはならない人間がいる――私のことだ。

というか、多くのプログラマーにとっては日常茶飯事だと思う。何万行にもわたるログやデータを黙々と解析し、たったひとつの問題を探り当てる。そのさまは常人の目に気の狂った猿として映るかもしれないが、我々プログラマーは特殊な訓練を受けており精神的苦痛を快楽に変換できる変質者なので生命に別状はない。

とはいえ、そういったテキストには読む必要のない行が大量に紛れているのが常である。目視で選別していたのではあまりに効率がわるい。プログラマーは合理主義者でもあるので、苦痛には耐えられても非効率には耐えられない。というわけで、そのようなテキストに出会った場合は正規表現を使うとずいぶん楽になるよ、というお話です。

下の表からお好みの正規表現を使って検索&一括置換すればIt’s so cool、いらない行だけさっぱり削してくれるのです。正規表現に拍手。

概要 検索文字列*1
空白行*2 ^\s*?$(\r\n|\r|\n)?
空行*3 ^$(\r\n|\r|\n)?
キーワードを含む行 ^.*キーワード.*$(\r\n|\r|\n)?
キーワードを含む行(複数指定) ^.*(キーワード1|キーワード2).*$(\r\n|\r|\n)?
キーワードが先頭に出現する行 ^キーワード.*$(\r\n|\r|\n)?
キーワードが末尾に出現する行 ^.*キーワード$(\r\n|\r|\n)?
キーワードを含まない行 ^(?!.*キーワード).*$(\r\n|\r|\n)?
キーワードを含まない行(複数指定) ^(?!.*(キーワード1|キーワード2)).*$(\r\n|\r|\n)?
キーワードを先頭に含まない行 ^(?!キーワード).*$(\r\n|\r|\n)?
キーワードを末尾に含まない行 ^(?!.*キーワード$).*$(\r\n|\r|\n)?

*1:改行コードはCRLF、CR、LF全てを対象にしています。
*2:空白行:改行のみ、または空白文字と改行のみの行。
*3:空行:改行のみの行。

使い方

  1. 正規表現が使えるテキストエディタでファイルを開く(サクラエディタ、秀丸など)。
  2. 検索文字列に表の正規表現を設定する。
  3. 置換文字列を空にする。
  4. 「すべて置換」を実行する。

例えば、こんなログがあるとします。

INFO  2018-01-31 15:00:00.000 1234/process1 message
ERROR 2018-01-31 15:00:00.000 1234/process1 message
INFO  2018-01-31 15:00:00.000 4321/process2 message
INFO  2018-01-31 15:00:00.000 1234/process1 message
INFO  2018-01-31 15:00:00.000 4321/process2 message
INFO  2018-01-31 15:00:00.000 1234/process1 message
INFO  2018-01-31 15:00:00.000 4321/process2 message
INFO  2018-01-31 15:00:00.000 4321/process3 message
INFO  2018-01-31 15:00:00.000 4321/process3 message
INFO  2018-01-31 15:00:00.000 1234/process1 message

仮にprocess1のログだけを見たいとした場合、process2やprocess3のログは邪魔者です。これが数万行あるというのだから、一行ずつ選別したのでは吐き気を催すというもの。表の「キーワードを含まない行」の正規表現を使って解決してみます。

^(?!.*process1).*$(\r\n|\r|\n)?

この正規表現で一括置換すると、

INFO  2018-01-31 15:00:00.000 1234/process1 message
ERROR 2018-01-31 15:00:00.000 1234/process1 message
INFO  2018-01-31 15:00:00.000 1234/process1 message
INFO  2018-01-31 15:00:00.000 1234/process1 message
INFO  2018-01-31 15:00:00.000 1234/process1 message

――はい、process1以外のログが消えました。めでたし。

↓メタ文字の説明はコチラ。
【正規表現】メタ文字一覧

↓ツールにしてみた。
【Webツール】条件に一致した行を削除する