Sed

無法使用 sed 替換路徑

  • March 26, 2020

如何使用 sed 命令將路徑替換為文件中的另一個路徑,並且當它用作腳本中的變數時,它正在工作。

sed -i "s/"system_filter = /etc/define_filter_file"/"system_filter = /usr/local/etc/file_regex"/g" /etc/exi.conf.bak

您需要轉義提供的路徑中的所有斜線,並將開始和終止引號更改為單引號。

sed -i 's/"system_filter = \/etc\/define_filter_file"/"system_filter = \/usr\/local\/etc\/file_regex"/g' /etc/exi.conf.bak

該命令表示為:

sed -i 's/path1/path2/g'

Path1 和 path2 不能清楚地包含/,因為這會與整個表達式混淆。

來自 GNU sed 的 infotex 手冊(請參閱 參考資料info sed):

s(作為替代)命令 的語法是s/REGEXP/REPLACEMENT/FLAGS. 這些/字元可以被 任何給定命令中的任何其他單個字元1統一**替換。**僅當字元前面有字元時,字元(或任何其他字元)才能出現在 REGEXP 或 REPLACEMENT 中 。s``/``\

|用作 REGEXP 和替換之間的分隔符,sed 命令變為:

sed -i 's|"system_filter = /etc/define_filter_file"|"system_filter = /usr/local/etc/file_regex"|g' /etc/exi.conf.bak

或簡而言之:

sed s|/some/path|/alternate/path/|

這比替代方案更容易,轉義大量正斜杠:

sed s/\/some\/path/\/alternate\/path\//

  1. sedOSX 上的手冊頁明確排除了上述*“任何其他單個字元”*\的限定條件中的反斜杠和換行符)

引用自:https://serverfault.com/questions/834134