sed で日本語が文字化けする原因と対処方法(ロケール設定、iconv での変換方法)

  • URLをコピーしました!
目次

はじめに

sed を使って日本語を含むテキストを処理したとき、文字化けして読めない結果になることがあります。
英語だけなら問題なくても、日本語特有の 文字コードやロケールの設定 が原因でトラブルになりやすいのです。

この記事では、代表的な原因とその解決策を分かりやすく解説します。

よくあるエラーパターン

例えば、次のようなケースです。

$ echo "こんにちは" | sed 's/こん/HELLO/'
HELLO�����

本来は「HELLOにちは」となるはずが、後半の文字が文字化けしています。

原因1:ロケール設定の問題

解説

Linux では ロケール(locale) と呼ばれる「言語と文字コードの組み合わせ」の設定が環境全体に影響します。
ロケールが CPOSIX になっていると、ASCII 以外の文字(日本語などマルチバイト文字)が正しく扱えません。

確認方法

locale

出力例(悪い例):

LANG=C
LC_CTYPE="C"

これでは日本語が化けやすい状態です。

解決方法

日本語ロケールを指定して再実行します。

export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8

これで sed も UTF-8 前提で処理するようになります。

原因2:ファイル自体の文字コード

解説

テキストファイルの文字コードが UTF-8 以外(Shift_JIS, EUC-JPなど)の場合、
シェルやsedがUTF-8を前提に扱おうとして文字化けします。

確認方法

file sample.txt

出力例:

sample.txt: Shift_JIS text

解決方法:iconv で変換

iconv を使えば文字コードを変換できます。

iconv -f SHIFT_JIS -t UTF-8 sample.txt > sample_utf8.txt

これで sample_utf8.txt はUTF-8に統一され、sedで扱いやすくなります。

実践例:修正前後の比較

修正前

$ echo "こんにちは" | sed 's/こん/HELLO/'
HELLO�����

修正後(ロケール設定後)

$ export LANG=ja_JP.UTF-8
$ echo "こんにちは" | sed 's/こん/HELLO/'
HELLOにちは

期待通りの結果が得られました。

まとめ

  • ロケールがCやPOSIXだと日本語は扱えないja_JP.UTF-8 を設定する
  • ファイルの文字コードがUTF-8以外だと化けるiconv でUTF-8に変換する

文字化けは「sedが壊れている」のではなく、
環境とファイルの文字コードの不一致 が原因です。

この理解を持っておけば、今後同じ問題に出会っても冷静に対処できます。

よくあるエラーと解決方法まとめ
目次