零弐壱蜂

Shift_JISファイルをgrepする方法

背景

古い日本語のWebサイトや、レガシーなWindowsアプリケーションのソースコードなどでは、Shift_JISエンコーディングが使用されていることが多い。

VS Codeなどのエディタで検索しても、UTF-8で検索してしまうため、Shift_JISのファイルをgrepできない。IntelliJ IDEAなどのIDEであれば、Shift_JISのファイルを検索できるが、そういった環境がない場合は、コマンドラインで検索する方法があると便利である。

従来はnkfでUTF-8に変換してからgrepする方法が一般的だったが、ripgrep--encodingフラグを使えばより簡潔に検索できる。

方法

環境

  • macOS

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を直接扱える。変換処理が不要でコマンドも簡潔になる。エンコーディング名はsjisshift-jisshift_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コマンドで完結する。

参考