多くの人が知っていると思うが、RubyはPerlの影響下で作成されたので、Rubyが「実用的なデータ抽出とレポート」というニッチでPerlを置き換えることができるという事実には驚くべきことはありません。 この短い投稿では、コンソールでテキストを微調整するためのルビーの使用について説明します。
TL; DR
次の2つの構造を覚えています。
... | ruby -lne <CODE>
ruby -lne <CODE> file1, file2, ...
前者の場合、入力は前のコマンドの出力になり、後者の場合-ファイルの内容の連結になります。
CODEは、 $_
変数に書き込まれる入力の各行に対して実行されます。 重要 :行の末尾には\n
が付きません(これは-l
フラグが原因です)。
例
反射cat
:
ruby -lne 'puts $_.reverse' file-to-show.txt
現在のディレクトリ内のファイル名の最初の10文字のみを印刷します。
ls | ruby -lne 'puts $_[0..9]'
いくつかの詳細
事前定義された変数
Rubyには多くの定義済み変数がありますが、その多くはあなたも私も知らないかもしれません。 その中には、Perlから移行されたものもあります。たとえば、 $_
および$<
(実際、Perlにはそのような変数はありませんが、/ stdinファイルから読み取り、 $_
を設定する入力演算子<>
構造があります)。
それらのリストはここにあります 。
投稿のトピックの一部として、前述の$_
と$<
に注意を払うことをお勧めします。さらに、 $~
、 $1
、 $stdin
、 ARGV
、 $stdout
、 STDIN
およびSTDOUT
も注意してください。
怖い秘密を取得
多くの場合、キーボード入力を要求するためにgets
を使用しgets
ます。 ただし、コマンドラインで引数-引数をチェックすることを誰もが知っているわけではありません。
ARGV
空でARGV
場合、 gets
はファイルのリストがそこに示されていると信じ、最初のものをgets
し、そこから行を読み取ろうとします。
スクリプトを実行します。
そして、 ruby myscript.rb
を使用して実行しruby myscript.rb
。 予想どおり、プログラムは入力を待っています。
次のように実行します:
ruby myscript.rb no-such-file
エラーが発生します:「no-such-file」ファイルは存在しません。 次に、スクリプトを変更します。
インタプリタは再び入力を待ちます。 ポップでは、「no-such-file」を破棄しました。
通訳オプション
これは私の単一行パターンのようです:
ruby -lne <CODE> [file1, file2, ...]
(多くの場合-l
なし)
使用されるオプションと潜在的に有用なオプションの説明:
-e <CODE>
-インタープリターが引数の中からスクリプトを検索してCODE
を実行しないようにします。-n
- while gets
スクリプト(または-e
渡されたコード)をラップしwhile gets
。 gets
メソッドは、変数$_
(hello、Perl!)の戻り値を暗黙的に設定します。これを使用する必要があります。 重要:行は\n
終わります。-l
簡単にするために、 $_
から改行文字\n
単に削除すると仮定できます。-p
-- -n
とまったく同じように機能しますが、各反復後に$_
の内容を表示します。 すなわち それを変更することを意味します。 例: ls | ruby -pe '$_.upcase!'
ls | ruby -pe '$_.upcase!'
-C <DIR>
-作業ディレクトリを変更します。-a
(自動分割から)-- -n
または-p
と組み合わせて使用し、 $F
変数を$_.split
-p
に設定します。-F
String#split
( $;
)の標準セパレーターを設定し$;
。 理論的には、 -a
と組み合わせて使用すると便利-a
。 たとえば、この方法で簡単な.csvを処理できます
おわりに
ruby -e
を初めて使用したとき、 cut
コマンドがプロンプトを表示しました。 私はそれを数回使用しなければならず、そのたびに、緊張した頭がすぐに理解したくないマニュアルを開く必要がありました。
結局、「はい、 cut
/ awk
/ sed
使い方がわかりません。しかし、Rubyをよく知っているのに、なぜそれをすべての小さなことに使えないのですか?」
実際、最終的には、多くのコマンドを覚えるのではなく、実験的に得られた構造だけを思い出すだけで十分です。
ruby -lne CODE
そしてそれだけです。 行ごとのテキスト処理に関する私の問題はすべて解決されました。
私が知る限り、ここでは革新的なものは何もありません。ひげを生やしたシステム管理者は長い間この方法でperlを使用しています。 そして、あなたの中には、これについて知っているが、それを使う価値のある人はいますが、それを使わない人がたくさんいると思います。 確かに、パイニストにも似たようなものがあります。
PS最後に、ここに使用例があります:
シリーズのシーズンをダウンロードしましたが、ファイル名が「s01e01-super-mega-macho.mkvによるスーパーリリース」のようにいので、ライブラリ内のすべてが美しいように名前を変更します。 お願い:
ls | ruby -lne 'File.rename($_, "#{$_[0..5]}.mkv")'