メモの日々


2019年05月31日(金) [長年日記]

[ruby] Rubyで簡単なファイル編集

Rubyで簡単なファイル編集を行うならワンライナーで済ますのがよい。ワンライナーを書くにはコマンドラインオプション

-e script
実行するスクリプトを指定する。
-i[extension]
引数で指定されたファイル群の内容を、標準出力へ書き込まれた内容で置き換える。extensionを指定すると変更前のファイルを残せる。
-l
-nオプションの読込結果(変数$_)が改行を含まなくなる。
-n
引数でしたファイル群の各行(行の内容は変数$_に設定される)に対して-eオプションで指定されたスクリプトを実行する。

あたりを使用する。

% ruby -nli -e 'print $_.gsub(/\+(\w+)\+/, "`\\1`").gsub(/_(\w+)_/, "*\\1*")' dir/**/*

ワンライナーにしないなら、ARGFを使うと同じ事ができる。

ARGF.inplace_mode = ""
ARGF.each_line do |line|
  print line.gsub(/\+(\w+)\+/, "`\\1`").gsub(/_(\w+)_/, "*\\1*")
end

ただ、inplace_modeを使うと標準出力への出力がファイルに出力されてしまうので注意が必要。

inplace_modeって取り消すことはできないのかな?