Git 管理下のファイルを一括置換する git-sed コマンドを作った


.find_by_admin よりも .find_by(type: :admin) の方が自然な書き方だった

開発中にこんな風に気づいてコードを直したくなった、
しかし .find_by_admin とすでに色々なファイルに書いてしまっている、という時は sed で一括置換するのが簡単です1

$ git ls-files | xargs -n 1 sed -i 's|find_by_admin|find_by(type: :admin)|g'

これは大変よく行う作業なので2、専用のコマンドにしてみました。

使い方

$ git sed 's|find_by_admin|find_by(type: :admin)|g'

また、特定のディレクトリのファイルのみを置換したいことがあります(例えば、テストコードのみを変更したい場合)。ファイルを検索するディレクトリ名を後ろに指定できます。

$ git sed 's|find_by_admin|find_by(type: :admin)|g' spec/ test/

ソースコード

以下のファイルを ~/bin/git-sed などに保存してください。

#!/bin/bash
set -euC
if [ "$#" -eq 0 ]; then
  echo 'git sed COMMAND [PATH [PATH[...]]]' >&2
  exit 1
fi

if which gsed > /dev/null; then
  SED=gsed # for macOS
else
  SED=sed
fi

CMD=(-e "$1")
shift

apply_sed() {
  f="$1"
}

while read -r f; do
  [ -f "$f" ] && [ ! -L "$f" ] && "$SED" -i "${CMD[@]}" "$f"
done < <(git ls-files -- "$@")

  1. IDEやフォーマッタが使える場合は、それらを使いましょう。 

  2. 私の場合。不惑に達していないので。