miau's blog?

grep 結果に「前後の 10 行を含める」とか

既存コードをいじるような場合、当然のように影響調査を行うことになります。
自分の中で完結させるぶんには Devas とか使ってればいいんですが、この結果を報告する必要があるような場合、grep 結果に「前後の 10 行を含める」とかできると便利です。

*nix なら grep -10 とかで済む話なんだけど、Windows でやろうとしたら大変だったのでその話。




■紆余曲折
まず前後プレビューができるってことで試した UnEditor。使いやすそうではあるけど、一括で出力ができないと報告書には使えない。

GNU grep(?)の Windows 版探した方がいいかも?ということで試してみた grep2.0+mb1.04。「このコンピュータでは扱えないファイル形式です」とか言われた。x64 だからか。

ispell-3.2.06 for Win32 にも egrep.exe が入ってるっぽい。動かしてみるとフォルダへのアクセス時に(?)「Permission denied」とか言われる。

あー。こんな面倒なら Cygwin でも入れておけばよかった。

■結局

Perl のスクリプト書きました。時間なかったのでかなり汚いコードですが。

use strict;
use warnings;

use File::Find;

my $regex = qr/script/i;
my $height = 3;

my @files;
find(
sub {
push @files, $File::Find::name if -f $_
},
'.'
);

my $html = '';
FILES:
foreach my $file (@files) {
open IN, '<', $file or die "can't open $file: $!";
my @lines = <IN>;
close IN;

my %found = ();
for (my $i = 0; $i < @lines; $i++) {
my $line = $lines[$i];
next FILES if $line =~ /\0/; # skip binary files
if ($line =~ $regex) {
for (my $j = $i - $height; $j < $i + $height; $j++) {
next if $j < 0 || $j >= @lines || defined($found{$j});
$lines[$j] =~ s/</&lt;/g;
$lines[$j] =~ s{($regex)}{<b>$1</b>}g;
$found{$j} = 1;
}
}
}

if (%found) {
$html .= "<br/>\n<b>$file: </b><br/>\n<pre>";
foreach my $i (sort keys %found) {
my $line = $lines[$i];
$html .= sprintf("%3d: %s", $i, $line);
}
$html .= "</pre>\n";
}
}

if ($html) {
$html = <<HERE;
<html>
<head><title>grep result</title></head>
<style type="text/css">
<!--
body {
height: 100%;
width: 100%;
margin: 0px auto;
}
pre {
border: 1px solid;
margin: 10px;
}
-->
</style>
<body>
$html
</body>
</html>
HERE
print $html;
}

これを my_grep.pl とかいう名前で保存しておいて、

del my_grep.hta
my_grep.pl > my_grep.hta
my_grep.hta

こっちを my_grep.bat として保存→実行と。

だいたい こんな感じ で表示される。

ハイライト表示は GD とか使ってもできるけど、面倒だったので HTML で書いた。
20〜30 分で書いたけど、一番てこずったのは pre 部分のスタイル指定だったりする。
あと今回は対象ファイルが Shift_JIS だとわかっていたので文字コード判別とかは省略。

真面目に実装するなら
・正規表現パターンを引数で受け取る
・対象ディレクトリを引数で受け取る
・文字コードの判定を行う
・ファイルのフィルタリング機能を追加
・.hta 内で PerlScript として実行させて、動的に表示を切り替えられるようにする
・シンタックスの色分け
くらいはやりたいところ。まあ、気が向いたら。
posted at 09:17:08 on 2007-02-20 by miau - Category: Perl No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。