2011/11/24

Recent entries from same category

  1. Go 言語プログラミングエッセンスという本を書きました。
  2. errors.Join が入った。
  3. unsafe.StringData、unsafe.String、unsafe.SliceData が入った。
  4. Re: Go言語で画像ファイルか確認してみる
  5. net/url に JoinPath が入った。

日本語を扱っていて困るのがgrep。正規表現パターンにマルチバイト文字を混ぜられなかったり、windowsで動かすと"表"の様に2バイト目にbackslashが混じる文字で動作しなくなったりします。
さらに複数のエンコーディングで書かれたファイルが散らばっていると一度のgrepで検索出来なかったりもします。
vimに限っては、内蔵のvimgrepを使う事で解決出来ますが、見つかったファイルをバッファに開いてしまうという挙動がある為、grepオリジナルの動作を求めている人にとっては都合の悪い物だったりもします。

vimgrepの様に複数のエンコーディングに対応していて、検索パターンにマルチバイト文字を含んだ正規表現が使えて、windowsでもちゃんと動いて、ついでといっちゃあなんだが、"**/*.txt"で再帰検索してくれる様なgrep無いかなぁと思ってたんですが、やっぱり無いので作りました。
こういう処理、実はGo言語が得意でして、意外と短いコードで書けてしまったりします。
もちろんバイナリが吐けるので配布も簡単。
mattn/jvgrep - GitHub

grep for japanese vimmer

https://github.com/mattn/jvgrep
内部ではgo-iconvという、元々別の方が作ったiconvモジュールをwindowsでダイナミックローディング対応させ使っています。もちろんスタティックリンクなので別途調達する必要もありませんが。なお、windows上での動作にはiconv.dllかlibiconv.dllが必要です。
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なので、当たり前ですが。
尚、Goのregexpパッケージがまだ発達途上なので":alpha:"の様な文字クラスは使えません。使いたい人は今すぐGo Developer Teamに参加してpatchを書いて下さい。(使える様になりました)

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
といった感じにお使い下さい。
Posted at by