LoginSignup
3
1

More than 5 years have passed since last update.

プロジェクト(ディレクトリ)内のコードを一気に置換する

Last updated at Posted at 2017-01-19

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 -lag -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
(なし)

これでファイルの中身が変更できます。

3
1
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
3
1