背景
古い日本語のWebサイトや、レガシーなWindowsアプリケーションのソースコードなどでは、Shift_JISエンコーディングが使用されていることが多い。
VS Codeなどのエディタで検索しても、UTF-8で検索してしまうため、Shift_JISのファイルをgrepできない。IntelliJ IDEAなどのIDEであれば、Shift_JISのファイルを検索できるが、そういった環境がない場合は、コマンドラインで検索する方法があると便利である。
従来はnkfでUTF-8に変換してからgrepする方法が一般的だったが、ripgrepの--encodingフラグを使えばより簡潔に検索できる。
方法
環境
nkfを使う方法(従来の方法)
nkfコマンドでShift_JISファイルをUTF-8に変換し、grepに渡す方法である。
brew install nkf
単一ファイルの場合はパイプで接続する。
nkf -w <file> | grep "keyword"
複数ファイルを検索する場合はfor文で各ファイルを処理する。
for file in <file>; do
nkf -w "$file" | grep --with-filename -H "keyword" | sed "s|^|$file: |"
done
--with-filename (-H): ファイル名を表示するsed "s|^|$file: |": ファイル名を各行の先頭に付加する
この方法は動作するが、UTF-8への変換処理を挟む必要があり、複数ファイルの検索にはfor文やシェルスクリプトが必要になる。
ripgrepを使う方法
ripgrepは--encoding(-E)フラグでShift_JISを直接扱える。変換処理が不要でコマンドも簡潔になる。エンコーディング名はsjis、shift-jis、shift_jisのいずれも指定可能である。
brew install ripgrep
ちなみにClaude Codeもripgrepを内部で使用しているので、Claude Codeをインストールしていれば、ripgrepも利用可能である。
which rg
単一ファイルの検索
rg -E sjis "keyword" <file>
nkfでの変換が不要になり、1コマンドで検索が完結する。
再帰検索
シェルの**グロブ展開でパスを指定すれば、再帰的に検索できる。
rg -E sjis "keyword" ./target-dir/**/*.html
複数のディレクトリやパターンも同時に指定可能である。
rg -E sjis "keyword" ./pc/**/*.html ./sp/**/*.html
nkf + grepでは複数ファイルの検索にfor文が必要だったが、ripgrepでは1コマンドで完結する。
参考