2010年4月2日金曜日

【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}'


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


0 件のコメント:

コメントを投稿