研究とか、いろんなデータ処理していると、ワンライナーをさくっと書きたい場面に出くわすことがあります。 自分は sed や awk にあまり慣れてなく、いちいち man 見ながらちまちま打ち込むよりはいつも使い慣れている Ruby の正規表現でさくっとワンライナーでも書けたら便利ですよね。で、ググったら意外にRubyのワンライナー情報がなくてびっくり。まぁ、Perlもあるしあんまり需要が無いのかも知れませんが。

ということでRubyでワンライナー書くときのまとめ。

ちなみにワンライナー自体についてはここを参照してください。


ワンライナーとは - はてなダイアリー
http://d.hatena.ne.jp/keyword/%A5%EF%A5%F3%A5%E9%A5%A4%A5%CA%A1%BC

使うRubyの実行時オプションは以下の2つです。

-e … このオプションのあとにスクリプト片を与えると、ファイルからスクリプトを読み込むのではなくそれをそのまま実行してくれます。(例えば、ruby -e ‘print “Hello World!¥n”‘ とすると画面にHello World!が表示されます。

-p … このオプション(引数なし)を与えると、プログラム全体が

while gets

print $_
end

で囲まれているかのように動作します。(…には上のスクリプト片が入る)
詳しい説明については以下のリファレンスを参照してください。


Rubyリファレンスマニュアル - Rubyの起動
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby%A4%CE%B5%AF%C6%B0#a.a5.b3.a5.de.a5.f3.a5.c9.a5.e9.a5.a4.a5.f3.a5.aa.a5.d7.a5.b7.a5.e7.a5.f3

こうすると、例えば

ruby -n -e ‘gsub(/ +/, “¥t”)’

で、ファイル中のスペースの連続をタブに置き換えてくれるワンライナーが書けます。これはデータをExcelに流し込むときに便利。また、

ruby -n -e ‘$_.upcase!’

は、ファイル中のアルファベットをすべて大文字にしてくれるワンライナーになります。

ポイントは、$_から読み込んで$_に出すようなコード片を書くこと。もしくは上のupcase!みたいに破壊的メソッドを使うか。まぁ、このへんはRubyやってる人には朝飯前でしょう。

ちなみに、ワンライナーを非常に頻繁に使いそうなら、シェルの設定で、(zshなら.zshrc, bashなら.bachrcに)

alias -g ROL=’ruby -p -e’

としておくと(ROLはRuby One-Linerの略。別に何でもいい)、上のが

ROL ‘$_.upcase!’

とか書けてとっても幸せです。

おまけ:

ROL ’sub!(/$/, “www”)’

文末に全部「www」を付けて、人を小馬鹿にしたような文章にするワンライナー。くだらねーwww