SEDで再帰的に交換

SEDで再帰的に交換

このように、複数のディレクトリの例を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 ...印刷を提供する前に追加してください。findsed

関連:

おすすめ記事