技術と魚

技術調査、開発TIPS、駄文

git管理下でgrepした行の文字列を置換する

もっと良い方法もありそうだけど、awk, while readにパイプしてやるといい感じになる。

# fooのある行をすべて検出してbarに置換
git grep -n "foo" | awk -F ":" '{ print $1" "$2 }' | while read f n; do sed -i '' -e "$n s/foo/bar/g" $f; done

一応何が起きているかを大雑把に説明

  • git grepはgit管理下のファイルをgrepする。 -n をつけると行番号がつく。 ファイル名:行番号:内容 というフォーマットになる
  • awk なにやらいい感じにコマンドラインで処理する用(あまり詳しくないので普段はrubyのワンライナーを使うことのほうが多いですが。) -F をつけると入力を区切るデリミタを指定できる。 printでスペース区切りにしている
  • while read; do ~; doneは入力を受け付けて~の処理をするのを入力がなくなるまで続ける
  • sedはファイル編集。置換や削除ができる。 -iはバックアップ用拡張子を指定するが不要なので空文字にする。 s/{target}/{replacement}/g 形式を与えると置換してくれる。その前に数値を入れれば行番号と認識する。