LoginSignup
6
3

More than 5 years have passed since last update.

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

Posted at

.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. 私の場合。不惑に達していないので。 

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3