メモ置き場

ワンライナー関連メモ

実行オプション

-e script : 引数で実行スクリプトを指定

$ ruby -e 'puts "hoge"'
hoge

# 複数指定した場合は改行を挟んだとして解釈される
$ ruby -e 'puts "hoge"' -e 'puts "fuga"'
hoge
fuga

-r feature : requireするライブラリを指定

$ ruby -rpp -e 'pp "a"'
"a"

-n : while getsで囲まれているように動作

Kernel.#getsは読み込んだ結果を$_にも設定する。 https://docs.ruby-lang.org/ja/latest/method/Kernel/m/gets.html

$ echo "1\n2\n3" | ruby -rpp -ne 'pp $_'
"1\n"
"2\n"
"3\n"

-p : -n + 各ループの最後に$_を出力

$ echo "1\n2\n3" | ruby -pe '$_="@"+$_'
@1
@2
@3

-l : 行末の自動処理

printでの出力に改行を付与し、-nもしくは-pが指定されている場合はgetsした文字列にString#chomp!を実行する。

$ echo "1\n2\n3" | ruby -rpp -nle 'pp $_'
"1"
"2"
"3"

-a : オートスプリットモードを有効化

各ループの先頭で$F = $_.splitを実行する

$ echo "1 2 3\n4 5 6" | ruby -rpp -nae 'pp $F'
["1", "2", "3"]
["4", "5", "6"]

-Fregexp : 入力フィールドセパレータの変更

String#splitで引数を省略した場合の区切りとして使用される正規表現を指定する

% echo "1, 2, 3\n4, 5, 6" | ruby -rpp '-F\s*,\s*' -nae 'pp $F'
["1", "2", "3\n"]
["4", "5", "6\n"]

-i : 引数で指定されたファイルを上書き

-iオプション値に拡張子を指定した場合は、変更元のファイルが拡張子を付けた名前で保存される。

$ echo "hoge" > file
$ ruby -rpp -nle 'pp $_' -i.backup file
$ cat file
"hoge"
$ cat file.backup
hoge

ARGF

引数に指定されたファイルを連結した仮想ファイルを表すオブジェクト。 Kernel.#getsARGF#getが呼ばれている。 https://docs.ruby-lang.org/ja/latest/class/ARGF.html

その他

# ファイル全体を置換
$ ruby -i -e 'print ARGF.read.gsub(/a/, "b")' file
# 一行ごとに置換
$ ruby -i -ple '$_.gsub!(/a/, "b")' file
# awk '{print $1,$2}' file
$ ruby -aple '$_=[$F[0],$F[1]].join(" ")' file

参考