Rubyと筋肉とギターとわたし

エンジニア二年目の雑魚です。プログラミング・ギター・筋トレのことをメインにブログを書いていきます。

【Linuxコマンド】特定の文字列を含むファイルを検索する

f:id:rdwbocungelt5:20180919135208j:plain

こんにちはもてぃです。

smot93516.hatenablog.jp

前のエントリも合わせて記事にします。

特定の文字列を検索して、文字列置換まで合わせてやりたいと思ったので備忘録として。。。

findを使う

$ find . -type f -print | xargs grep '検索したい文字列'

最初はこれをうまく使ってやろうと思いました。

が、これだと検索したファイル名のパス:検索した文字列の形で出てきます。

例えばこんな感じ。

$ cd html # => 配下にindex.html, mobile.htmlなどがあるとする

$ find . -type f -print | xargs grep 'head'
./html/index.html: <head>
./html/index.html: </head>
./html/mobile.html: <head>
./html/mobile.html: </head>

文字列置換と合わせてやりたい場合に後ろの検索した文字列は本当に邪魔。

どうにかして、ファイルパスのみ表示したかった。。。

ということでgrep再帰的に使う

grepのオプションを使えば解決出来ました。

-r : 再帰的にgrepコマンドを実行
-n : 行番号を表示する
-w : 文字列全体にマッチする場合
-l : ファイル名だけを出力

-l : ファイル名だけを出力

これらをうまく使います。

$ grep -rlw . -e 'head'
./html/index.html
./html/index.html
./html/mobile.html
./html/mobile.html

あとはxargssedを使って、文字列を置換してやればおkって感じです。

以下はSSL化の際のhttpをhttpsへ置換するコマンド。

# カレントディレクトリ配下全てのファイルのhttpをhttpsへ置換
$ grep -rlw . -e 'https' | grep html | xargs sed -i -e 's/http:/https:/g'

終わりに

以下の記事を参考に致しました。

ありがとうございます。

qiita.com