さらに複数のエンコーディングで書かれたファイルが散らばっていると一度のgrepで検索出来なかったりもします。
vimに限っては、内蔵のvimgrepを使う事で解決出来ますが、見つかったファイルをバッファに開いてしまうという挙動がある為、grepオリジナルの動作を求めている人にとっては都合の悪い物だったりもします。
vimgrepの様に複数のエンコーディングに対応していて、検索パターンにマルチバイト文字を含んだ正規表現が使えて、windowsでもちゃんと動いて、ついでといっちゃあなんだが、"**/*.txt"で再帰検索してくれる様なgrep無いかなぁと思ってたんですが、やっぱり無いので作りました。
こういう処理、実はGo言語が得意でして、意外と短いコードで書けてしまったりします。
もちろんバイナリが吐けるので配布も簡単。
mattn/jvgrep - GitHub内部ではgo-iconvという、元々別の方が作ったiconvモジュールをwindowsでダイナミックローディング対応させ使っています。もちろんスタティックリンクなので別途調達する必要もありませんが。なお、windows上での動作にはiconv.dllかlibiconv.dllが必要です。
grep for japanese vimmer
https://github.com/mattn/jvgrep
Go言語の開発環境を持っていらっしゃる方ならば、最新までバージョンを上げて頂いた後
# goinstall github.com/mattn/jvgrep
として頂いたらインストールしてくれます。go-iconvが依存物としてインストールされますが、linux等ではiconvのヘッダおよびライブラリが必要になりますので注意です。windowsはダイナミックローディングしているので必要ありません。ちなみに、win32版のみ最新版のjvgrepをダウンロード出来る様にしてあります。上記リンクから"Downloads"をクリックして"jvgrep-win32.tar.gz"を落とし、解凍して下さい。iconv.dllを同梱しています。ウィルスチェック済み。
使い方は普通のgrepです。
# jvgrep 表[現示] *.txt
この様に日本語で、しかもwindowsだと誤動作するダメ文字にも対応しています。まぁGo言語は内部では全てutf-8なので、当たり前ですが。
尚、
vimmer向けに
# jvgrep 表[現示] **/*.txt
という使い方も出来ます。
オプションは現状ありません。出力結果はgrepで"-n"オプションを付けた時の出力内容に合わせてあります。サポートしているエンコーディングは
- iso-2022-jp-3
- iso-2022-jp
- euc-jisx0213
- euc-jp
- utf-8
- ucs-bom
- euc-jp
- eucjp-ms
- cp932
仕組みはvimと同じです。 vimからは
set grepprg=jvgrep
とvimrcに書けば使えます。
:grep 表[現示] **/*.txt
といった感じにお使い下さい。