[プログラミング] 文字コードを自動認識するgrepが欲しい
LVというフリーソフトウェアに複数の日本語エンコードを自動認識するlgrepというプログラムが付属している。
が、-r ( --recursive ) オプションをサポートしていない。
zshの "**/*.java" 形式のワイルドカードを使えば -r を代用できるが、展開後のファイル数が爆発すると問題が発生する。
(1行の長さ制限に捕まると、エラーが出てgrepの実行前に止められる)
Gaucheでgrepを書いてみようかなとも思うが、そこまでするほどでも無い気がするんだよな。
こういうのを許容時間内に書けるスキルが必要だなーと思う今日この頃。
ktatさんからコメントをもらったので、追記。
lgrep ですが、 find -print0 -type f | xargs -0 lgrep 'hoge' とかどうでしょうか。
いつもこのコマンドで実行しています。何回もコマンドを打ちこみ直すのが大変なんです。
alias lgrep='find -print0 -type f | xargs -0 lgrep ' とか。パス渡せませんが。
そうか。aliasか...
このアドバイスでbashのfunctionを使えば実現できそうな気がしてきたぞ。
うまくいったらまた記事を書きます。
ktatさんのコメントをヒントにスクリプトを作ったので追記。
結局このスクリプトで運用開始した。この程度で十分使えることが判明した。
lgrep-rのソースコード
#!/bin/bash
if [ "" = "$1" ] ; then
echo "usage 'lgrep-r [pattern]'"
exit 1
fi
find . -print0 -type f | grep -z -Z -v '.svn' | xargs -0 lgrep -n $1
出力をUTF-8に揃えたい場合は、最後の行を次の様に変更すればOK。
find . -print0 -type f | grep -z -Z -v '.svn' | xargs -0 lgrep -Ou8 -n $1
lgrep-rの動作
カレントディレクトリから再帰的に '日本語検索パターン' でgrepする。
ファイルの日本語コードは自動判別する
Subversionの管理ディレクトリ.svnは除外する
grepの結果には行番号も含む ( grep -r '日本語' * の結果に合わせてある )
使いかた
コンソールから
lgrep-r '日本語検索パターン'
Emacsから
カスタマイズ変数grep-commandを '/usr/local/bin/lgrep-r 'に設定しておけば
M-x grep で日本語エンコードを自動認識したgrepが使える。