Quantcast
Channel: vdeep
Viewing all articles
Browse latest Browse all 155

「git grep + sed」コマンドでGitリポジトリ以下の特定の単語を置換する

$
0
0


こんにちは、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オプションが有効になり、正常に動作するはずです。

参考になれば幸いです。


Viewing all articles
Browse latest Browse all 155

Trending Articles