kiyokaのブログアーカイブ

Archive of old blog posts

文字コードを自動認識する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のソースコード ```bash #!/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。
```bash
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が使える。