目次
はじめに
sed
を使って日本語を含むテキストを処理したとき、文字化けして読めない結果になることがあります。
英語だけなら問題なくても、日本語特有の 文字コードやロケールの設定 が原因でトラブルになりやすいのです。
この記事では、代表的な原因とその解決策を分かりやすく解説します。
よくあるエラーパターン
例えば、次のようなケースです。
$ echo "こんにちは" | sed 's/こん/HELLO/'
HELLO�����
本来は「HELLOにちは」となるはずが、後半の文字が文字化けしています。
原因1:ロケール設定の問題
解説
Linux では ロケール(locale) と呼ばれる「言語と文字コードの組み合わせ」の設定が環境全体に影響します。
ロケールが C
や POSIX
になっていると、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が壊れている」のではなく、
環境とファイルの文字コードの不一致 が原因です。
この理解を持っておけば、今後同じ問題に出会っても冷静に対処できます。
あわせて読みたい


【コマンド詳細】sedコマンドの使い方とオプションまとめ
sed コマンドとは? sed (Stream Editor) は、LinuxやUNIXシステムで使われるストリーム形式のテキストエディタです。ファイルを直接開くことなく、以下のようなテキス…
よくあるエラーと解決方法まとめ
あわせて読みたい


【完全版】sedエラー大全|よくある原因と解決方法まとめ
sed は Linux 環境でテキスト処理を行う際に非常に便利なコマンドですが、オプションや正規表現の違い、環境依存の仕様によって多くのエラーが発生します。初心者はもち…