コンソールの作業を簡素化するruby -e

多くの人が知っていると思うが、RubyはPerlの影響下で作成されたので、Rubyが「実用的なデータ抽出とレポート」というニッチでPerlを置き換えることができるという事実には驚くべきことはありません。 この短い投稿では、コンソールでテキストを微調整するためのルビーの使用について説明します。


TL; DR


次の2つの構造を覚えています。


  1. ... | ruby -lne <CODE>
  2. 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$stdinARGV$stdoutSTDINおよびSTDOUTも注意してください。


怖い秘密を取得


多くの場合、キーボード入力を要求するためにgetsを使用しgetsます。 ただし、コマンドラインで引数-引数をチェックすることを誰もが知っているわけではありません。


ARGV空でARGV場合、 getsはファイルのリストがそこに示されていると信じ、最初のものをgetsし、そこから行を読み取ろうとします。


スクリプトを実行します。


 # myscript.rb puts gets 

そして、 ruby myscript.rbを使用して実行しruby myscript.rb 。 予想どおり、プログラムは入力を待っています。


次のように実行します:


 ruby myscript.rb no-such-file 

エラーが発生します:「no-such-file」ファイルは存在しません。 次に、スクリプトを変更します。


 # myscript.rb ARGV.pop puts gets 

インタプリタは再び入力を待ちます。 ポップでは、「no-such-file」を破棄しました。


通訳オプション


これは私の単一行パターンのようです:


 ruby -lne <CODE> [file1, file2, ...] 

(多くの場合-lなし)


使用されるオプションと潜在的に有用なオプションの説明:



おわりに


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")' 


Source: https://habr.com/ru/post/J339544/


All Articles