検索スクリプト wgrep

w3mを利用して grep の機能拡張版を作ります。w3m は標準入力からの入力を処理できるためスクリプトが簡潔になります。

wgrep の引数をそのまま grep に渡しているので、使用法は grep と全く同じです。カレント・ワーキング・ディレクトリーを検索する場合、

wgrep <keyword> *

ディレクトリーを指定する場合は

wgrep <keyword> ~/hoge/*

になります。

w3mはVine Plusにも収録されています。w3m の操作法はどの画面が表示されているときでも、H (大文字のH) キーを押すとヘルプ画面を表示させて確認することができます。ヘルプ画面を消すには B (大文字のB) キーを押します。

検索スクリプト wgrep

スクリプトファイル名:wgrep
スクリプト:

#!/bin/sh
exec grep $@ | lf.pl | w3m -T text/html

grep --> HTML 変換フィルター

ファイル名:lf.pl
スクリプト:

#!/usr/bin/perl
while (<>) {
/^(.*?):(.*)/;
print "<A HREF=\"$1\">$1</A><BR>\n$2<BR><BR>\n";
}

追記: grep --> HTML 変換フィルター改良版

上の lf.pl を HTML 文書に利用した場合、単語をヒットした行にタグが含まれているとそれ以下の表示が乱れてしまう欠点があります。それを改良したのが下のスクリプトです。lf.pl と差し替えると、上の欠点を回避することができます。しかし、jperl 5.004_04-980303 では日本語が文字化けします。jperl 5.005_03_990822 では大丈夫なようです。

#!/usr/bin/perl

while (<>) {
	/^(.*?):(.*)/;
	$url = $1;
	$line = $2;
	$line =~ s/\&/\&amp\;/g;
	$line =~ s/\</\&lt\;/g;
	$line =~ s/\>/\&gt\;/g;
	$line =~ s/\"/\&quot\;/g;
	print "<a href=\"$url\">$url</a><br>\n$line<br><br>\n";
}

# lf.pl

追記: sed, awk を利用した wgrep

wgrep を sed, awk を使って記述してみました。かなりコンパクトになります。

#!/bin/sh

grep -d skip $@ | 
sed '{ s/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g}' |
awk 'BEGIN {FS= ":"} {print "<a href=\"" $1 "\">" $1 "</a><br>" $2 "<br>"}' |
w3m -T text/html