04. キーワード検索と正規表現

キーワード検索をする上で、正規表現を覚えておくとかなり便利です。例えばあるファイルについて

  • コメントアウトされた行以外を表示したい
  • 行の途中から始まるコメント部分だけ除きたい

という場合に、正規表現は役立ちます。コメントが「//」であるとき、正規表現

^\s*\/\/.*$

は、「行頭からはじまって(^)、スペースもしくはタブが0個以上(\s*)あって、コメント(\/\/)があって、その後ろに0個以上の何かが行末まで(.*$)ある」、という意味になります。

また、上記コメント行を除いた状態で、「行中にコメントがある」ときのコメント部分だけにマッチする正規表現は

\s*\/\/.*$

となり、「スペースまたはタブが0個以上(\s*)あって、コメント(\/\/)があって、その後ろに0個以上の何かが行末まで(.*$)ある」という意味になります。

これを以下のテキスト(re.txt)

//abc
 //def
    //ghi
module abc;
  wire jkl; //hoge
endmodule

に対して処理し、以下の文字列を取得するスクリプトを例示したいと思います。

module abc;
  wire jkl;
endmodule

--- tcsh

tcshではgrepを併用します。

#!/usr/bin/tcsh -f
foreach line ( "`cat re.txt`" )
  echo $line | \grep '^\s*\/\/.*$' >& /dev/null
  if ( $status == 1 ) then
    echo "$line" | sed 's/\s*\/\/.*$//'
  endif
end

--- Perl

#!/usr/bin/perl
use warnings;
open(IN, "re.txt");
while(<IN>){
  chomp;
  if(!/^\s*\/\/.*$/){
    s/\s*\/\/.*$//;
    print "$_\n";
  }
}
close(IN);

--- Ruby

#!/usr/bin/ruby -w
f = open("re.txt", "r")
f.each do |line|
  if(/^\s*\/\/.*$/ !~ line)then
    line.sub!(/\s*\/\/.*$/, "")
    puts line
  end
end
f.close

--- Python

#!/usr/bin/python
import re
f = open("re.txt")
for line in f:
    if not re.search(r'^\s*\/\/.*$', line):
        line = re.sub(r'\s*\/\/.*$', '', line)
        print line,