ぶていのログでぶログ

思い出したが吉日

rfコマンドv1.1.0をリリースした

github.com

rfコマンドのv1.1.0をリリースした。 もう少し機能を追加してからにしようと思ったけど、サクサクリリースしていこう精神でバージョンを上げた。 以下、追加された機能や変更点の説明をする。

バイナリをstripしてファイルサイズを少し減らした

cc時に-sをつけていたのだが、リンカには-sをつけてなくてstripされていなかったのを修正した。 そもそもファイルサイズが4MB以上あってstripしてもファイルサイズが減る量は微々たるものだが、やっていないよりマシという感じ。

特殊変数をいくつか追加した

利便性向上のためにrfで使える特殊変数をいくつか追加した。

  • record, _0 : 入力されているレコード。_と同じ
  • fields : 入力されているフィールド。$Fと同じ
  • NR, $.: 1始まりの入力されたレコード数

recordfieldsについては、それぞれ_$Fと同値なのだが、英語名がついていたほうがわかりやすいので追加したという感じ。 _0はawkにおける $0のイメージ。 また、入力されたレコード数を示す変数としてNR$.を追加した。 NRはawkのNRと同じイメージ*1$.はCRubyに置いてはIO.getsの回数なのだが、rfでは入力されたレコード数とした。

jsonフィルタに-rオプションを追加した

JSONの文字列はダブルクォーテーションで囲われていて文字がエスケープされている。例; "foo\u0010" CLIで処理するときに、ダブルクォーテーションやエスケープを解除したほうが便利なことがある。 jqにおいては-rオプションがあり、StringをRaw出力ができる。 それと同等のことができるオプションとして-rを追加した。

echo '"hello"' | rf -j '"#{_}\nworld"'
#=> "hello\nworld"

echo '"hello"' | rf -jr '"#{_}\nworld"'
#=> hello
#=> world

*1:この実装時にRubyにおいてはレシーバのない大文字は定数として扱われて、レシーバがあるとメソッドとして扱われるという違いを知った。最初実装しているときにこの違いが分からなくて、instance_evalの中からNFメソッドを呼び出せなくて困惑していた。違いに気がついたあとは普通に定数として定義している。