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