データベースの文字列を置き換えようとしています。以下で可能な解決策を見つけました。#
orを使用すると%
私には適していますが、/
andでは機能しません|
。最初の2つが機能する理由と違いが何であるかを説明できる人はいますか?
find . -type f -name 'file.sql' -exec sed -i '' s#http://a.com#http://b.com#g {} +
find . -type f -name 'file.sql' -exec sed -i '' s%http://a.com%http://b.com%g {} +
find . -type f -name 'file.sql' -exec sed -i '' s/http://a.com/http://b.com/g {} +
find . -type f -name 'file.sql' -exec sed -i '' s|http://a.com|http://b.com|g {} +
答え1
sed 置換コマンド通常コマンド、検索文字列、代替文字列、およびフラグ/
の区切り文字として使用されます。s
ただし、検索文字列または代替文字列にを含めることができる場合は、区切り文字/
を次の文字に変更します。いいえどんな文字列でも。
sedに空の文字列をバックアップ拡張として使用するように指示したときに、sedで別のエラーが発生しました。拡張機能を使用していないため、空の引用符を入れないでください。 (注:これはGNU sedでのみ機能します。たとえば、MacでBSD sedを使用している場合するバックアップ拡張子を指定しない場合は、空の文字列が必要です。 )
Sedは区切り文字が何であるか気にしませんが、周囲のシェルはおそらく気にします。
この|
記号はパイプを表します。これを区切り文字として使用するには、シェルで保護するために何らかの方法で引用する必要があります。
この#
シンボルはシェルに応じてコメント文字列を導入できるため(#
bashはコメントが単語の最初の文字である場合にのみコメントを開始します)、安全に引用するのが最善です。
データに/
文字が含まれているため、異なる区切り文字を使用するか、/
検索および置換文字列から各インスタンスをエスケープする必要があります。これはいわゆる傾いたつまようじ症候群形のため読みにくいです\/
。
したがって、次のようなものが必要です。
find . -type f -name 'file.sql' -exec sed -i -e 's#http://a.com#http://b.com#g' {} +
または
find . -type f -name 'file.sql' -exec sed -i -e 's|http://a.com|http://b.com|g' {} +
または
find . -type f -name 'file.sql' -exec sed -i -e "s|http://a.com|http://b.com|g" {} +
または
find . -type f -name 'file.sql' -exec sed -i -e 's/http:\/\/a.com/http:\/\/b.com/g' {} +