前の投稿(gnuwin32のsedコマンド使用時に半角記号や文字コードで気をつけること)ですが、Rubyのワンライナーなら、もっと簡単に書けるかもしれないと思い、試してみました。
今回も、Windows環境で、バッチファイルからコマンドを実行する形式としました。
結論としては、思ったほど楽にはなりませんでした。半角記号のエスケープは、今回もよくわかりませでした。
#単純な変換
単純な変換は次のようにできすね。
※バッチファイルの第1引数には入力ファイルが指定される想定です。変換後のテキストは標準出力します。
@echo off
ruby -pne '$_.gsub!(/abc/,"ABC")' %1
複数まとめて変換したいときは、次ですね。
@echo off
ruby -pne '$_.gsub!(/abc/,"ABC")' -e '$_.gsub!(/def/,"DEF")' %1
#半角記号の変換
次のように、いくつかの記号はエスケープする必要がありました。
@echo off
ruby -pne '$_.gsub!(/[!"#\\$%%\&()*+,-.\/:;<=>?@\[\]^_`{|}~]/,"")' -e "$_.gsub!(/'/,'')" %1
- 「\」「&」は、「\」(円記号またはバックスラッシュ)でエスケープが必要でした。
- 「%」は、「%」でエスケープが必要でした。
- 「'」は、「'」括り内でのエスケープ方法がわからなかったので、別途、「"」括りを用意しました。
#日本語(文字コードUTF-8、改行コードLF)の変換
文字コードがUTF-8で、改行コードがLFのテキストファイルについて、文字列置換する場合は、次のようにできました。
ruby -Ks -ne '$_ = $_.force_encoding("UTF-8").encode("Windows-31J"); $_.gsub!(/朝/,"昼"); $stdout.binmode.write($_.encode("UTF-8"))' %1
まず、WindowsバッチファイルはSJISで作成してありますので、rubyコマンドのオプションに、「-Ks」を指定しています。
$_.force_encoding("UTF-8")
の部分で、入力ファイルがUTF-8であることを明示しています。
続けてencode("Windows-31J")
とすることで、文字コードをUTF-8からSJIS(Windows-31J)に変換しています。
文字列置換を行った後は、文字コードをUTF-8に戻して出力しています。
出力時は、改行コードがCRLFに変換されることを防ぐため、$stdout.binmode.writeメソッドを使用しています。
#動作確認環境
私が動作確認した環境は次です。
- Windows 7 64bit
- ruby 1.9.2p0
動作確認に使用したサンプルファイル類は、次の場所に登録しておきました。
- kurukurupapa/TryRuby の test_sed.rb、sed_*.bat
#参考