ケルベロスさんのプログラミング / けるぷろ

プログラマのけるさんことケルベロスです

MacのTerminalでファイル内テキスト検索&テキスト置換

テキスト検索

findコマンド grepコマンドを使用します

find ディレクトリ | xargs grep -rn "検索したい文字列"  

-r はディレクトリ内を再帰的に検索するオプション
-nは検索結果に行数を表示するオプション

find ~/Desktop -name "*.swift" | grep -rn "kerusan"

デスクトップ内の.swiftファイル内のkerusanという文字列を検索

テキスト置換

gsedコマンドを使用します

brewコマンドでインストールできます

brew install gnu-sed  
gsed -i "" -e "s/置換前の文字列/置換後の文字列/g"  ファイル 

-i は上書き保存するオプション ( --in-place ) -e はスクリプトを実行してバックアップを作成するオプション (--expression=script) バックアップ作成は強制されてしまうのですが -i ""とすることでバックアップファイルを作らずにコマンドを実行することができます

gsed -i "" -e "s/keru/san/g" kerusan.txt

kerusan.txt内のkeruをsanに置換

複数ファイルのテキスト置換

上記コマンドの組み合わせで実現します

find ディレクトリ | xargs grep -rl "置換前のテキスト" | xargs gsed -i "" -e "s/置換前のテキスト/置換後のテキスト/g"  

grepのオプションが-rlになっていますが
-l というのは文字列が存在するファイル名のみを出力するオプションです
これによって検索したいファイル名のみを後続のgsedコマンドに渡すことができます

find ~/Desktop -name "*.swift" | xargs grep -rl "keru" | xargs gsed -i "" -e "s/keru/san/g"

デスクトップの.swiftファイル内全ての文字列"keru"を"san"に置換する

参考

Macでgrepした結果をgnu-sedを使ってsedする - 塩焼きブログ
[Linux][Mac]複数ファイルまとめて特定の文字列を検索するコマンド(2種類) | SATOPEDIA
MacとLinuxでは、sedの動作が異なるので注意 | ITを使っていこう

追記

grepのlオプション(マッチするファイル名のみ列挙)について久しぶりに使おうとすると忘れがちなのでメモ --files-with-matches というオプションの省略系が -l という覚えづらさ笑 files の lと覚えておきましょう

コマンドのオプションは何でもしばらく使わないと忘れてしまいますよね 省略してない形式も一緒に覚えて意味で捉えておくと良いかもしれませんということで追記でした

参照 grepの-lオプションと-Lオプション - 気ままなブログ