find と xargs による検索と置換が機能しない

find と xargs による検索と置換が機能しない

ターゲット フォルダーとサブフォルダー内の HTML/CSS ファイルのソース コードにある URL を検索して置換しようとしています。次のコマンドを使用しようとしました。

find . -type f | xargs sed -i  's/https\:*\.websitedomain\.fr\///g'

何が足りないのでしょうか?

アドバイスをいただければ幸いです

答え1

GNU システム ( の使用法からsed -i推測すると、これが該当する) を前提とします。

eregex='https://[^/[:space:]]+\.websitedomain\.fr/'
find . -type f -exec grep -lZEe "$eregex" {} + |
  xargs -r0 sed -i -E "s|$eregex||g"

あなたのアプローチにおける問題点のいくつか:

  • 主な違いは、*正規表現演算子が前のアトムの 0 個以上に一致するため、:*0 個以上の に一致することです。ここでは、これを 1 個以上の ( 、拡張正規表現演算子なので) 文字 (空白と(おそらく、たとえばに一致することを想定していたもの)):に置き換えています。[^/[:space:]]++-E/.*google.com/ and foohttps://google.com/ and foo.websitedomain.fr/file
  • の出力形式find -print(1 行に 1 つのファイル パス) は、想定される入力形式xargs(空白または改行で区切られ、引用符で囲まれている可能性のある単語) と互換性がありません。 の出力形式はfind -print後処理を確実に行うことができないため、人間が使用する目的でのみ使用してください。 を使用するか、 (および はGNU 拡張機能)find ... -exec cmd {} +を含む NUL 区切りのレコードを使用することをお勧めします。xargs -r0-r-0
  • sed -iは、ファイルを元のファイルの修正されたコピーに置き換えますが、メタデータ情報が失われる可能性があります。そのため、修正されないファイルでは実行を避けるのが最善です。そのため、 または を使用して、正規表現に一致する行が少なくとも 1 つあるファイルのgrep -lZリスト (-Zで使用できるようにで区切られた NUL xargs -0) を取得します。
  • :は正規表現演算子ではないため、エスケープする必要はありません。何が\:一致するかは POSIX では指定されておらず、ほとんどの実装では文書化されていません。そのため、現在は実装でsedに一致する可能性がありますが、将来的には変更される可能性があります (または が元々 および に一致していたのに対し、新しいバージョンではそれぞれ単語境界と単語文字に一致するようになりました)。:sed\<\w<w
  • sedsコマンド内の正規表現または置換に が含まれている場合/、バックスラッシュでエスケープするよりも、別の文字を区切り文字として使用する方が簡単です/。バックスラッシュでエスケープすると、読みにくくなります。したがって、s|regexp|replacement|gここでは の代わりにを使用しますs/regexp/replacement/g。読みやすいコードになるので気に入っています。ただし、 /の中ではコマンドを区切るのに|使用できないという欠点があります(これも拡張正規表現演算子です)。exvis/regex/replacement/|ex

答え2

これを試して:

find . -type f | xargs sed -i  's/test\.com/set\.com/g' 

以下のものが含まれているかどうかをテストする必要がある場合https次にこれを試してください:

find . -type f | xargs sed -i  's/https\:\\\\test\.com/https\:\\\\set\.com/g' 

注*: これはテスト設定.com

関連情報