Sed

sed #、%、/ 和 | 之間的區別

  • March 15, 2021

我正在嘗試替換數據庫中的字元串。我在下面找到了可能的解決方案。使用#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' {} +

引用自:https://unix.stackexchange.com/questions/369149