「git grep + sed」コマンドでGitリポジトリ以下の特定の単語を置換する
こんにちは、okutani(@okutani_t)です。本記事では、自分の備忘録用に「git grepとsedコマンドでGitリポジトリ以下の特定の単語を置換する」方法について解説しています。
git grepコマンドは、Gitリポジトリ以下で管理されているファイルのみgrepしてくれる便利なコマンドです。
かつ、Gitリポジトリ以下のみを対象にしているので、高速に動作するのが特徴です。
そのあと、git grepした結果をsedコマンドを使って単語を置換する処理をおこなっています。
それでは、実際のコマンドを見てみましょう。
スポンサーリンク
git grepとsedで単語を置換
「Foo」という単語を「Bar」に置換したい場合、以下のコマンドを使えば一発で置換できます。
$ git grep -l 'Foo' | xargs sed -i '' -e 's/Foo/Bar/g'
かんたんに解説します。
git grep -l 'Foo'
git grepの「-l
」オプションを使うと、マッチしたファイルのファイル名だけを返してくれます。
よく利用しそうなgit grepのオプション一覧を載せておきます。
-e | 検索する文字列を指定。複数指定するといずれかにマッチしたものを出力 |
---|---|
-i | 大文字と小文字を区別せずに検索 |
-w | 単語検索(例:「git grep -w user」でusersやuserDataなどはマッチせず、userやhoge.userなどのみヒット) |
-v | マッチしなかった行を出力 |
-E | POSIX正規表現を利用 |
-F | 検索に正規表現を利用しない |
-n | マッチしたファイル名の後ろにマッチした行数を表示 |
-l | マッチしたファイル名だけを表示 |
-L | マッチしなかったファイル名だけを表示 |
ちなみに、正規表現は単語を「''
」でくくるとONになるようです。
実際に、現在実装中のRailsプロジェクトで実行してみます(Fooは任意の文字列です)。
$ git grep -l 'Foo'
...マッチしたファイルの一覧...
カウントしてみます。
$ git grep -l 'Foo' | wc -l
13
13ファイルヒットしました。
sedで置換する
git grepで絞り込みができたので、その処理結果をxargsを使ってsedに渡してあげます。
$ git grep -l 'Foo' | xargs sed -i '' -e 's/Foo/Bar/g'
かんたんに解説します。
利用したsedのオプションは以下のとおりです。
-i | ファイルを直接編集 |
---|---|
-e | ファイルを編集するコマンドを指定 |
-eの引数で利用したコマンドのオプションは以下のとおりです。
s | string(文字列)を置換する |
---|---|
g | ファイル内すべてを対象 |
実行すると、Git管理されているファイルのみ、Fooという文字列がBarに置換されます。
git statusコマンドやgit diffコマンドで確認してみると良いかと思います。
Macで-iオプションを利用する
実は、Macで上記のコマンドを実行するとこけます。
Macはgnu-sedを入れないと-iオプションが効かないので、Homebrewで導入しておきましょう。
$ brew install gnu-sed
これでMacでも-iオプションが有効になり、正常に動作するはずです。
参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク