滑らかなRuby 1ライナー


私が最初にRubyを学び始めたとき、私が読んだ最初の本は、コマンドラインオプションとフラグのすべてについての先頭の章を持っていましたruby コマンド.ポイントがなくなって、いつものように、私は、そのセクションを通じて、多くのことを読むことなく、素早く反転しました.「はい、ええ、はい」私は私のエディタを開いたように私自身に言った.「なんでもいいものを見せてちょうだい、あの物を見せてくれ!さて、私は言うためにここにある.私が今読んでいる異なる本の章Practical Ruby for System Administration アンドレベンHamouによっても、これに関するセクションがありました、そして、この時、私は注意を払いました.今、私は他の皆とハイライトを共有したい!

良いもの

簡易実行
簡単に始めましょう.The -e Rubyインタプリタにインラインのコマンド文字列を実行し、結果を出力するstdout . 浮動小数点演算を行うためのdarn bashコマンドを覚えていない場合に便利ですbc )!
$ ruby -e 'puts (Math.sqrt(32**2/57.2))' > calc.txt
引用符についての注意.便利なRubyの1つのライナーの多くには、以下のような特殊な変数が含まれます$_, $<, and $. . これは、bash文字列の補間をミックスに追加するまで、すべて細かいとダンディです.bashでこのような変数を補間します.
echo "That's no $silly_thing, that's my wife!"
Rubyコマンドをダブルクォートで囲むと、特別な変数は予測できません.それはすべての回でコマンドの周りの単一の引用符に固執するのがベストです.
最初の例は、あなたがGoogleのbashコマンドを頑固に拒否している場合に便利です.しかし、私たちはちょうど暖かくなっているので、私と一緒に.

ライン毎処理
The -n あなたの実行された1つのライナーを暗黙のうちにラップしますwhile gets ... end ブロック.Rubyの特別なグローバル変数の使い方と組み合わせると$_ , 最新の結果を格納するKernel.gets コマンドは、いくつかの良いファイルを処理することができます!
$ ruby -ne 'puts $_.strip if $_ =~ /soup/' /home/rpalo/recipes
これは余分な空白を取り除き、「スープ」という単語を含むすべての行を印刷します.私はあなたのことを知りません、しかし、そのようなスクリプトは私の基盤に重要です.
タイピングに飽きたらputs $_.something.something しばらくして、心配しないでください.The -p フラグを暗黙のうちに削除するprint $_ コマンドの最後に変数を変更することができます.以下の例をクリーンアップできます.
$ ruby -pe '$_.strip! if $_ =~ /soup/' /home/rpalo/recipes
エディット2月19日$_ 変数は任意の正規表現に対してテストされるデフォルト変数です.したがって、上記の行は以下のように簡略化できます.
$ ruby -pe '$_.strip! if /soup/' /home/rpalo/recipes
あなたはそこに少なくとも4文字全体を保存している.つの場所でそれをすべて使用しないでください.

ファイル編集中
私は、私が実際の開発者ではないと感じますsed or awk コマンド!「まず最初に、それは愚かです.あなたは文句で始まる誰でも無視しなければなりません.加えて、ファイルを編集したときに悲しいと感じますsed -i )!ここでは、4つの方法は、これを行うには、順番にレベルの増加のレベルです.設定ファイルからデフォルトのコメントを削除したいとしましょう(あなたが自分自身を追加することを約束しない限り、推奨されません).
編集2/19/18 :入力と出力を同じファイルにリダイレクトする(ファイル全体をワイプする).この次のスニペットは、それを反映するように更新されています.詳細はコメントを参照ください.またgsub 正規表現と同じ規則に従って$_ デフォルトでは省略することができます.
$ ruby -pe 'gsub(/#.*$/, "")' .myconfig > .myconfig.new
$ mv .myconfig .myconfig.old
$ mv .myconfig.new .myconfig
への印刷ではなく、変更された行を新しいファイルにリダイレクトするSTDOUT . 場合は、すべての余分な作業をカットすることができます-i フラグ.
$ ruby -i -pe 'gsub(/#.*$/, "")' .myconfig
これは、複数のファイルに対してこのコマンドを実行したい場合に便利です.
$ ruby -i -pe 'gsub(/#.*$/, "")' *.conf
globマッチは、それぞれのファイルを通して実行されます.confを上書きしてください.
最後に、もしあなたがパラノイアでリスク回避しているならば(つまり、あなたはスクリプトのエラーでファイルを上書きして、すべてを失うことを知っているのに十分な長さを使っています.-i フラグ:-i.bak そして、それは書き込み前に、そのファイルの拡張子と古いバージョンを保存します.myconfig コメントはありませんが、新しいものがあります.myconfig.bak それはまだです.

There MUST be NO space between the -i and the backup file extension or it won't work. You have been warned.



耕作する
二つ以上の特別なグローバル変数について話したい.$< and $. . 最初のファイルは入力されたファイルを指します.2つめは現在の行番号を指します.(これは$. and $<.lineno は同義である).のバージョンをアンインストールすることができますhead このように:
$ ruby -ne 'puts $_ if $. <= 10' test.txt
CSVファイルやシステムファイルなどの区切られるファイルのフィールドを使用するには/etc/passwd , 最初に試してみてください.
$ ruby -ne 'puts $_.split.first + $_.split.last' test.txt
それは動作しますが、あなたのために行われた重い持ち上げを持つことができます-a , これは"autosplit "の略です.プリスプリットフィールドを特殊変数にドロップします$F .
$ ruby -a -ne 'puts $F.first + $F.last' test.txt
上記の例はデリミタとしてスペースを使用するだけですが、を指定できます-F .
$ ruby -a -F: -ne 'puts $F.first' /etc/passwd

セットアップとティアダウン
あなたが使ったならばawk , それから、この次の部分はよく知られているかもしれません.入力ファイルとteardown/final出力を実行する前に初期化を行うことができますBEGIN and END ブロック.パターンにマッチする行の総数を数えるようなものに便利です.
$ ruby -ne 'BEGIN { ducks = 0 }; ducks += 1 if $_ =~ /ducks/; END { puts ducks }' duckfile.txt
このセットアップとティアダウンを使用して、あなたの1つのライナーはかなり強力な取得します.

モジュールを必要とする
あなたはおそらく実際に他の方法でこれを使用しているが、Gemとモジュールを標準ライブラリから-r コマンド.たとえば、マシンのIPアドレスを一覧表示するには、次のようにします.
$ ruby -rsocket -e 'puts Socket.ip_address_list.map(&:inspect)'
Primesと遊ぶ!
$ ruby -rprime -e 'puts Prime.first(20)'

ラッピング
全体的に、これらは10 xの生産性向上を与えることはできませんが、彼らは楽しいし、彼らは興味深いアプローチを提供するように感じる.あなたがRubyプロジェクトに深く携わっていて、bashにあなたの脳を切り替えるならば、彼らは特に役に立ちます.このポストを書く途中で、私はGoogleに行きました、そして、この話題に関する驚くべき数のブログ柱があります.(正直に言うと、私はそれについて転職する気がする).しかし、それは楽しい話題です、そして、それはちょうどRuby楽しみを使用するそれらのもののもう一つです、それで、私はそれが共有するのが良いと思いました.とにかく、つぶやき/メッセージを私はすべての時間を使用して任意のクールなルビー1ライナーを持っている場合!このリストに追加します.

素晴らしい人々によって提出
## First two submitted by me to make this not be a sad empty list :|
# Delete trailing whitespace
$ ruby -pe 'gsub(/\s+$/, "\n")'

# Prints too long lines
$ ruby -ne 'puts $_ if $_.length > 80'
の知恵に感謝します.
もともと投稿 assert_not magic?