やりたいこと
- コマンドライン上でファイルの内容を置換したい
- ワンライナーで行いたい
- 正規表現を使いたい
方法
$ cat ~/Downloads/yoyo.rb
class Yoyo
MATERIALS = {
:a6061 => 'アルミ合金 (A6061)',
:a7075 => 'アルミ合金 (A7075)'
}.freeze
end
$ ruby -i -e 'gets(nil).gsub(%r{:(\w+) => (.+)$}) { "#{$1}: #{$2}" }.then { puts(_1) }' ~/Downloads/yoyo.rb
$ cat ~/Downloads/yoyo.rb
class Yoyo
MATERIALS = {
a6061: 'アルミ合金 (A6061)',
a7075: 'アルミ合金 (A7075)'
}.freeze
end
解説
ruby コマンドのオプションについて
Ruby の起動 (Ruby 3.3 リファレンスマニュアル) より
-e script
コマンドラインからスクリプトを指定します。-e オプションを付けた時には引数からスクリプトファイル名を取りません。
-i[extension]
引数で指定されたファイルの内容を置き換える (in-place edit) ことを指定します。元のファイルは拡張子をつけた形で保存されます。拡張子を省略するとバックアップは行われず、変更されたファイルだけが残ります。
Kernel.#gets について
Kernel.#gets (Ruby 3.3 リファレンスマニュアル) より
gets(rs = $/) -> String | nil[permalink][rdoc][edit]
ARGF から一行読み込んで、それを返します。行の区切りは引数 rs で指定した文字列になります。rs に nil を指定すると行区切りなしとみなしてファイルの内容をすべて読み込みます。
バージョン情報
$ ruby -v
ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [arm64-darwin23]