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

おすすめ記事