【Ruby】複数ファイルの内容を、ワンライナーで一括置換

いっつも忘れるのでメモ。

以下の簡単な例では、特定ディレクトリ以下の全ての txt ファイルを対象に、”foo” または “bar” という文字列に “baz” をくっつけます。こういう用途では Perl が王道ですが、Ruby好きとしてはこっちを使いたいですよね。

find . -name *.txt | xargs ruby -i -p -e '$_.gsub! %r{(foo|bar)}, %q{\1baz}'

-i -p -e などRubyの起動オプションの詳細については、下記の参考サイトをご覧ください。

Mac OSX 環境での注意点

ちなみにMac OSX 環境ではファイル名・ディレクトリ名にスペースが入るので、find -print0xargs -0 の組み合わせで find コマンドの出力をNULL文字区切りにするのがセオリーだそうです。

find . -name *.txt -print0 | xargs -0 ruby -i -p -e '$_.gsub! %r{(foo|bar)}, %q{\1baz}'

参考にさせていただいたサイト


この記事について