bekkou68 の日記

Gogengo! や IT 技術など。

プロジェクト内のコードのパスを指定して一括置換するシェルスクリプト

何かと使いたくなるのでメモがてらに置いておきます。コマンドにしておくと便利そう。

例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

こんなふうにもやってくれちゃうので、改善が必要そう。

例3(19時ごろ追記)

以下の例は、app/views 配下のすべての .haml ファイル中の "hoge" を含む行を削除します。sed でやろうとしたら行をまたがる処理が面倒で挫折したので Ruby でやりました。

$ for FILE in app/views/**/*.haml; do cp $FILE $FILE.tmp; ruby -pe "gsub(/\s*hoge.*\n/, '')" $FILE.tmp > $FILE; rm $FILE.tmp; done