Ruby のコマンドラインオプションを復習しました!

ダオカオス☆技術局

こういうのはワンライナーで十分だよね。と思いつつも、Perl の時は多少なりともワンライナーで書いていたのに Ruby では全然書いてなくて、それでもってオプション指定しようとして戸惑いました。

これはマズい!と思ったので、慌てて復習してみました。

なお以下はざっと書いてみただけなので信用しないで下さい。興味を持ったらちゃんとリファレンスマニュアルを読んで下さいね。

よく使うからさすがに覚えているオプション

よく使うから覚えているものを列挙してみます。

  • -h : help見れないとどうにもならないから
  • --version : バージョン確認しないと不安だもの
  • -e : コードの実行
  • -K : 文字コードの指定
  • -c : 統語チェック
  • -d : $DEBUG = true
  • -I : ロードパスの追加
  • -r : require、便利だけど gem 依存してると頼りない(1.8)
  • -T : 大好きな $SAFE を指定
  • -v : 冗長モード、色々エラーメッセージ見れるから好き

こんなものでしょうか。

便利なはずなのに忘れていたオプション

必須とも言える n, p を覚えていませんでした!なんてこった鳥頭!

  • -n : 入力を一行づつ処理、各行が $_ にいれられます
  • -p : -n と一緒だけど、加えて $_ を出力
  • -a : オートスプリットモード、各行を分割して $F にいれてくれます
  • -F : String#split の分割方法を正規表現で指定、-a と一緒に使えば便利
  • -C : 指定したディレクトリに移動してからスクリプト実行
  • -l : -n, -p の時各行に String#chop! してくれる便利なヤツ

そもそも覚える気のないオプション

こういうのは、まぁ覚えてなくていいかなぁ、と思うもの。

  • -0 : 入力レコードセパレータを指定
  • --copyright : Rubyライセンスであることは分かっているから覚えなくていいと思う
  • -i : 指定を間違えて大変なことになるに決まってるから使わない
  • -S : 使ったことないし、きっと今後も使う機会がないと思うから
  • -w : -v でいいんじゃないだろうか
  • -W : -v でいいんじゃないだろうか
  • -x : スクリプトを取り出して実行、いつ使えばいいのか分からない
  • -y : ユーザが見ても仕方ないからいいよね

いざ実践

では ダオカオス☆技術局ワンライナーで書き直してみます。

まずたぶんそれっぽい入力データを用意します。こんなの。

1	2007-08	2008-07	a
2	2006-07	2007-06	b
3	2005-06	2008-07	c
4	2007-08	2007-12	d
5	2003-04	2005-01	e

じゃあこれを in.txt としてコマンドラインから次を実行します。

% ruby -ape '$_ = "" unless $F[1] =~ /\A2007-08/' in.txt > out.txt

out.txt の内容は次のようになります。

1	2007-08	2008-07	a
4	2007-08	2007-12	d

やったね!

と思ったのですが、こういう時は -n の方が素直なんでしょうか。

% ruby -ane 'print if $F[1] =~ /\A2007-08/' in.txt > out.txt

というくらいに戸惑うわけなので、やっぱり普段からちゃんと練習しておこうと思いました。反省。