ターゲット フォルダーとサブフォルダー内の 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 foo
https://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
で使用できるようにで区切られた NULxargs -0
) を取得します。:
は正規表現演算子ではないため、エスケープする必要はありません。何が\:
一致するかは POSIX では指定されておらず、ほとんどの実装では文書化されていません。そのため、現在は実装でsed
に一致する可能性がありますが、将来的には変更される可能性があります (または が元々 および に一致していたのに対し、新しいバージョンではそれぞれ単語境界と単語文字に一致するようになりました)。:
sed
\<
\w
<
w
sed
のs
コマンド内の正規表現または置換に が含まれている場合/
、バックスラッシュでエスケープするよりも、別の文字を区切り文字として使用する方が簡単です/
。バックスラッシュでエスケープすると、読みにくくなります。したがって、s|regexp|replacement|g
ここでは の代わりにを使用しますs/regexp/replacement/g
。読みやすいコードになるので気に入っています。ただし、 /の中ではコマンドを区切るのに|
使用できないという欠点があります(これも拡張正規表現演算子です)。ex
vi
s/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