Sed
sed #、%、/ 和 | 之間的區別
我正在嘗試替換數據庫中的字元串。我在下面找到了可能的解決方案。使用
#
or%
對我有用,但不適用於/
and|
。誰能解釋為什麼前兩個有效以及它們之間的區別是什麼?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 {} +
Sed 的替換命令通常用作命令、搜尋字元串、替換字元串和任何標誌
/
之間的分隔符。s
但是,如果搜尋字元串或替換字元串中的任何一個可能包含 a/
,那麼人們會將分隔符更改為不在這兩個字元串中的字元。當您告訴 sed 使用空字元串作為備份副檔名時,您收到了另一個錯誤;因為你沒有使用擴展,所以不要把空引號放在裡面。(注意:這僅適用於 GNU sed。如果你使用的是 BSD sed,例如在 Mac 上,那麼你確實需要空字元串來指定沒有備份擴展。)
Sed 不關心分隔符是什麼,但你周圍的 shell 可能。
該
|
符號介紹了一個管道。要將它用作分隔符,您必須以某種方式引用它以保護它們免受外殼的影響。該
#
符號可能會根據您的 shell 引入註釋字元串(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' {} +