📋

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のリファレンスを参照してください。

最初のN行と特定の文字列を含む行を表示する

次は少し複雑な使い方です。最初の何行かは無条件で出力し、そのあとは特定の文字列を含んだ行のみを表示します。例えばCSVやテーブルで、ヘッダー行は残したまま、特定の行のみ表示したいと言ったときに使えます。
ここでは、最初の1行目とfooを含んだ行のみ表示してみます。

> rf 'NR==1 || /foo/' example.txt
No Name   Price
1  foo    100
4  foobar 400

この使い方はわりとよく使うので(私調べ)覚えておくと良いでしょう。

脚注
  1. サブコマンドは前方一致で判断されます ↩︎

GitHubで編集を提案

Discussion