Rubyでワンライナーを書く基本パターン

コマンドラインオプション-peを指定して、特殊変数$_を書き換えるプログラムを与える。

$ ls -l
total 2296
-rw-r--r--   1 root  wheel        753  9 24  2007 6to4.conf
-rw-r--r--   1 root  wheel        515  9 24  2007 afpovertcp.cfg
   .
   .
   .
$ ls -l | ruby -pe '$_.upcase!'
TOTAL 2296
-RW-R--R--   1 ROOT  WHEEL        753  9 24  2007 6TO4.CONF
-RW-R--R--   1 ROOT  WHEEL        515  9 24  2007 AFPOVERTCP.CFG
   .
   .
   .
$ ls -l | ruby -ne 'puts split[0]'
total
-rw-r--r--
-rw-r--r--
   .
   .
   .

-eオプションはコマンドラインで与えた文字列をスクリプトとして実行する。
-nあるいは-pを指定すると、コマンドラインで与えたコードがwhile gets; endで囲まれているように動作する。各行のデータは$_に格納される。

while gets
  # ... この部分の処理をコマンドラインに書く
end

-pは、各ループ処理ごとに$_の値を出力する。-nでは自動的には出力されないので自分でputsなんかで出力する。

ファイルに対して処理を実行したい

ファイル自身の内容を置き換えて処理したい場合は、

$ ruby -i.bak -pe '$_.upcase!' hoge.txt

のように-iオプションを使う。バックアップファイルを作成する必要がなければ-i.bakではなく単に-iとする。

(2008-09-10)