今川館

都内勤務の地味OLです

grepに-rオプションがあることを今日知った

今までずっとfindとxargsを使っていた

今まで、特定のディレクトリを再帰的に辿って指定したパターンにマッチする文字列を含むファイルを探すときはfindとxargsを使っていた。

例えば、カレントディレクトリ以下を辿って"Linux"という文字列を含むファイルを探すとき、

find . -type f -name "*.py" | xargs grep "Linux"

こんなコマンドを叩いていた。

手軽に操作できるのはgrep -rだった

ところが、grepには-rオプションがあって、これを指定すればディレクトリをどんどん辿ってくれる。

grep -r "Linux" .

これで同じことができる。
拡張子が".py"のファイルだけ対象にしたければglobのパターンを使う。
その場合、-rオプションは要らない。

grep "Linux" ./**/*.py

grepの-lオプションとxargs sedを使ってまとめて置換する

grepには-lオプションがあって、これを指定するとファイル名だけを返す。
"-l"オプションを渡したgrepをパイプを使ってxargs sedをしてやるとまとめて置換を行える。

grep -rl "Linux" . | xargs sed -i s/Linux/リナックス/g

などとすると、ファイルの内容をまとめて置換できる。
(通常、sedはファイルの内容を書き換えないが、-i オプションを渡すと書き換えまで行うらしい。)

ということをとある若者から今日教わったのでここにメモしておく。