プロジェクト内のコードのパスを指定して一括置換するシェルスクリプト
何かと使いたくなるのでメモがてらに置いておきます。コマンドにしておくと便利そう。
例1
以下の例は、app/controllers/hoge/fuga 配下のすべての .rb ファイル中の "Hoge::Fuga" を "Hoge::Piyo" に一括置換します。
$ for FILE in app/controllers/hoge/fuga/**/*.rb; do cp $FILE $FILE.tmp; sed -e 's/Hoge::Fuga/Hoge::Piyo/g' $FILE.tmp > $FILE; rm $FILE.tmp; done
例2(2014/01/29 追記)
以下の例は、app/ 配下のすべてのファイル中のハッシュロケットを Ruby1.9 っぽく一括置換します。
$ for FILE in app/**/*.*; do cp $FILE $FILE.tmp; sed -e 's/:\([a-zA-Z_]*\) => /\1: /g' $FILE.tmp > $FILE; rm $FILE.tmp; done
メモ: 文字列の ( を置換する時はそのまま書く。グループ化したい場合はバックスラッシュ付きで \( 書く。
- :hoge => 'fuga' + hoge: 'fuga'
ただし、
- rescue ActiveRecord::RecordInvalid => e + rescue ActiveRecord:RecordInvalid: e
こんなふうにもやってくれちゃうので、改善が必要そう。