もっと良い方法もありそうだけど、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
形式を与えると置換してくれる。その前に数値を入れれば行番号と認識する。