LoginSignup
2
2

More than 5 years have passed since last update.

Windows環境rubyワンライナーにおける半角記号や文字コードで気をつけること

Last updated at Posted at 2013-12-07

前の投稿(gnuwin32のsedコマンド使用時に半角記号や文字コードで気をつけること)ですが、Rubyのワンライナーなら、もっと簡単に書けるかもしれないと思い、試してみました。
今回も、Windows環境で、バッチファイルからコマンドを実行する形式としました。

結論としては、思ったほど楽にはなりませんでした。半角記号のエスケープは、今回もよくわかりませでした。

単純な変換

単純な変換は次のようにできすね。
※バッチファイルの第1引数には入力ファイルが指定される想定です。変換後のテキストは標準出力します。

ruby_sed_sample001.bat
@echo off
ruby -pne '$_.gsub!(/abc/,"ABC")' %1

複数まとめて変換したいときは、次ですね。

ruby_sed_sample001.bat
@echo off
ruby -pne '$_.gsub!(/abc/,"ABC")' -e '$_.gsub!(/def/,"DEF")' %1

半角記号の変換

次のように、いくつかの記号はエスケープする必要がありました。

ruby_sed_sample010.bat
@echo off
ruby -pne '$_.gsub!(/[!"#\\$%%\&()*+,-.\/:;<=>?@\[\]^_`{|}~]/,"")' -e "$_.gsub!(/'/,'')" %1
  • 「\」「&」は、「\」(円記号またはバックスラッシュ)でエスケープが必要でした。
  • 「%」は、「%」でエスケープが必要でした。
  • 「'」は、「'」括り内でのエスケープ方法がわからなかったので、別途、「"」括りを用意しました。

日本語(文字コードUTF-8、改行コードLF)の変換

文字コードがUTF-8で、改行コードがLFのテキストファイルについて、文字列置換する場合は、次のようにできました。

ruby_sed_sample020.bat
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

動作確認に使用したサンプルファイル類は、次の場所に登録しておきました。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2