TL; DR
git grep -l 置換したい文字列 | xargs sed -i '' -e 's/置換前/置換後/g'
ファイル例
first.js
Hoge
Fuga
BarBaz
second.js
Hoge
Bar
FooBarBaz
first.jsとsecond.jsの1行目にあるHogeをFugaに置換してみましょう。
検索にヒットさせる
git管理している場合: gitのサブコマンド grep を使います。
結果が出たら、キーボードのqを押して抜けます。
command
git grep Hoge
result
first.js:Hoge
second.js:Hoge
(END)
git管理はしていない場合: ag を使います
command
ag Hoge
result
second.js
1:Hoge
first.js
1:Hoge
ファイル名を抽出する
-l
をつけます。
git grepのとき
command
git grep -l Hoge
result
first.js
second.js
agのとき
command
ag -l Hoge
result
first.js
second.js
xargs
に結果を渡す
xargs を使って、ファイル群にコマンドを当てることができます。
(使い方は次の sed
と一緒に例示します)
sed
で置換する
sed を使って、ファイル内の文字列に置換処理を実行します。
先ほどの git grep -l
や ag -l
の結果を渡して行います。
ターミナルには特に何も表示されませんが、ファイルは変更されるはずです。
git grepのとき
command
git grep -l Hoge | xargs sed -i '' -e 's/Hoge/Fuga/g'
result
(なし)
agのとき
command
ag -l Hoge | xargs sed -i '' -e 's/Hoge/Fuga/g'
result
(なし)
変更したい文字列でgrepしたらいらない文字列がくっついている別のコードが出てきた
command
git grep BarBaz
result
first.js:BarBaz
second.js:FooBarBaz
(END)
BarBaz
という文字列をほかの文字列に変更しようと思ってコマンドを叩いたとき、上の例でいうところの FooBarBaz
は変えたくない、というときがあります。
そのような場合、 grep -v
で候補を削ぎ落とします。
command
git grep BarBaz | grep -v Foo
result
first.js:BarBaz
このままだとファイル名だけを抽出できません。
ここで awk というコマンドを使います。
command
git grep BarBaz | grep -v Foo | awk -F: '{print $1}'
result
first.js
ここまで来たら、先ほどのコマンド群が適用可能になります。少し長いですが、
command
git grep BarBaz | grep -v Foo | awk -F: '{print $1}' | xargs sed -i '' -e 's/BarBaz/QuxQuux/g'
result
(なし)
これでファイルの中身が変更できます。