gnuwin32のsedコマンドを使ってみて、少し実用的に使ってみとうかと思ったら、半角記号のエスケープ方法や、文字コードの扱いに、気をつけなければならないことがあったので、メモしておきます。
#単純な変換
単純な変換は次のようにできすね。
※変数「%infile%」「%outfile%」には、ファイル名が定義されていることとします。
sed s/abc/ABC/g %infile% > %outfile%
sed s/朝/昼/g %infile% > %outfile%
複数まとめて変換したいときは、次ですね。
sed -e s/abc/ABC/g -e s/def/DEF/g %infile% > %outfile%
sedスクリプトファイルを使う場合は、次ですね。
sed -f sedscriptfile.sed %infile% > %outfile%
s/abc/ABC/g
#半角記号の変換
半角記号の中には、特殊な意味を持つものがあるので、エスケープが必要であることはわかっていましたが、エスケープの仕方が、記号によって異なったり、コマンドラインから実行する場合とバッチファイルから実行する場合で異なったりするので、扱いが難しいです。
ネットを探してみると、すぐに情報が見つかるのですが、自分の環境では上手く行かない部分もあったりしました。
私の環境で、Windowsバッチファイルから、gnuwin32 sedコマンドを使う場合に、半角記号のエスケープは、次のように行えば上手くいきました。
- 「$」「.」「/」「[」「]」「\」は、「\」(円記号またはバックスラッシュ)でエスケープが必要でした。
- 「%」は、「%」でエスケープが必要でした。
- 「&」「<」「>」「|」は、「"」で括って、エスケープ(?)しました。
- 「^」は、前に「\」を付けて、「"」で括る必要がありました。
- 「"」は、エスケープ方法がわかりませんでした。コマンドラインから実行する場合は、「\」でエスケープ出来たのですが、Windowsバッチファイルから実行する場合は、方法がわかりませんでした。
※たぶん、この辺の話は、sedというより、Windows側の仕様の話ですよね。
#日本語(UTF-8)の変換
gnuwin32 sedコマンドは、SJISを前提に動作しているようですので、UTF-8のテキストファイルを変換する場合には、文字コードの変換が必要でした。
次のようにして、事前にUTF-8→SJIS変換し、sedを実行、さらにSJIS→UTF-8して元の文字コードに戻すと上手くいきました。
※文字コードを変換せずに、UTF-8のファイルをそのままsedに渡すと、sedの処理が止まってしまうようで、応答が戻ってこなくなりました。(その場合は、Ctrl+Cで停止させることが出来ました。)
iconv -f UTF-8 %infile% | ^
sed s/朝/昼/g | ^
iconv -t UTF-8 > %outfile%
※ここでは「^」を使って、複数行に分けて記述していますが、「^」を削除して1行にしても実行可能です。
#動作確認環境
私が動作確認した環境は次です。(これ以外の環境で、動かしたら、また異なる動きになるんだろうか?う~ん、わからない。)
- Windows 7 64bit
- gnuwin32 sed 4.2.1
- gnuwin32 iconv (GNU libiconv 1.11)
動作確認に使用したサンプルファイル類は、次の場所に登録しておきました。
- kurukurupapa/TryWindowsBatchのSedTest.bat