📋
rfコマンドを使った基本的なテキストフィルタリング
基本的なテキストフィルタリング
rfコマンドを使って基本的なテキストフィルタリングを行う方法を解説します。
コマンドの説明
テキストフィルタ行うときにはrfコマンドのサブコマンドにtextを指定します。このtextは短くしてtやteなどでも問題ありません[1]。また、textサブコマンドの時のみこれを省略することができます。
サブコマンドの指定したら、次の引数にコマンド、そして入力するファイルのパスを指定します。ファイルパスを指定しない場合、標準入力から読み込みます。
> rf text 'コマンド' ファイルパス
# ファイルパスを省略すると標準入力から読み込む
> rf text 'コマンド'
# textは省略もできる
> rf t 'コマンド' <ファイルパス>
> rf 'コマンド' <ファイルパス>
利用例
では、実行例を見ていきましょう。ここでは以下のようなファイルを使って説明していきます。
example.txt
No Name Price
1 foo 100
2 bar 200
3 baz 300
4 foobar 400
特定の文字列を含んだ行のみ表示する
まずは特定の文字列を含んでいる行のみ表示してみます。正規表現リテラルを使い特定の文字列パターンを指定します。ここではfooを含む行のみ表示してみます。
> rf '/foo/' example.txt
1 foo 100
4 foobar 400
fooを含まれている行のみ表示されましたね。上記ではZennのMarkdownの仕様上、数字の出力が色付きで表示されていますが、実際にはfooの部分に色がつきます。

文字列の置換
次にファイル内の一部の文字のみ置換してみます。ここでは、大文字化してみます。
> rf 'sub(/foo/, "FOO")' example.txt
No Name Price
1 FOO 100
2 bar 200
3 baz 300
4 FOObar 400
subメソッドはレコード中の最初にマッチした部分のみ置換します。レコード中のすべてのマッチした部分を置換したい場合にはgsubメソッドを使います。
subやgsubの詳しい使い方はCRubyのリファレンスを参照してください。
- https://docs.ruby-lang.org/ja/latest/method/String/i/sub.html
- https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html
最初のN行と特定の文字列を含む行を表示する
次は少し複雑な使い方です。最初の何行かは無条件で出力し、そのあとは特定の文字列を含んだ行のみを表示します。例えばCSVやテーブルで、ヘッダー行は残したまま、特定の行のみ表示したいと言ったときに使えます。
ここでは、最初の1行目とfooを含んだ行のみ表示してみます。
> rf 'NR==1 || /foo/' example.txt
No Name Price
1 foo 100
4 foobar 400
この使い方はわりとよく使うので(私調べ)覚えておくと良いでしょう。
-
サブコマンドは前方一致で判断されます ↩︎
Discussion