このように、複数のディレクトリの例をgrepとsedに再帰的に置き換えることは可能ですか?
grep -e "http://localhost:4000" -r ~/dev_web/_site | sed -e 's/http:\/\/localhost:4000/https:\/\/another_site.com/g'
これを行うと端末に完了したと表示されますが、再度grepすると次のようになります。
grep -e "https://another_site.com" -r ~/dev_web/_site
4つのファイルだけが変更されたと思います。
私がこうすれば:
grep -e "http://localhost:4000" -r ~/dev_web/_site/
はいhttp:localhost:4000はまだここにあります。
ベストアンサー1
パイプラインがファイルを変更していません。正規表現に一致する行を抽出し、そのgrep
データを変更しますが、ファイルを変更しようとしません。
代わりにGNUを想定すると、次のようになりますsed
。
find ~/dev_web/_site -type f \
-exec grep -qF 'http://localhost:4000' {} ';' \
-exec sed -i 's#http://localhost:4000#https://another.site#g' {} +
これにより、ディレクトリ内または下のすべての一般ファイルが検索されます~/dev_web/_site
。これらのファイルごとに、grep
まずファイルに指定された文字列が含まれていることをテストします。含まれている場合は、sed
内部置換のためにGNUが呼び出されます。
このgrep
ステップは省略できますが、GNUはsed
修正タイムスタンプを更新します。みんなこれに関する文書はありません。
以下のディレクトリにあるファイルのサブセットのみを表示したい場合があります~/dev_web/_site
。その場合は、-name '*.js'
次の項目(または一致させたい名前パターン)に検索を制限してください-type f
。
-print
に-exec sed ...
印刷を提供する前に追加してください。find
sed
関連: