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,