我需要透過 sed 將 Unix 路徑替換為 bash 腳本中包含另一個 Unix 路徑的變數
例子:
another_unix_path=/another/unix/path
sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt
答案1
您需要轉義特殊字元:
another_unix_path="\/another\/unix\/path"
echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g'
輸出這個結果:
/另一個/unix/路徑
答案2
轉義特殊字元/
是一種選擇。
您也可以使用以下範例變更預設sed
分隔符號(即):/
?
another_unix_path="/another/unix/path"
echo /some/path/file.txt | sed -e 's?/some/path/file.txt?'$another_unix_path'?g'
標誌後面使用的字元s
定義將使用哪個分隔符號:s?
編輯 :
#!/bin/sh
basepath=/another/unix/path
baseurl=/base/url
sed -i 's?# set $IMAGE_ROOT /var/www/magento2;? set $IMAGE_ROOT '$basepath$baseurl';?g' somefile.txt
答案3
如果您使用/
分隔符,那麼您必須轉義/
路徑中的每個字符,例如sed 's/\/some\/path/'$replacement'/g'
幸運的是,sed - 就像 Perl - 允許使用許多字元作為分隔符,因此您也可以編寫sed 's#/some/path#'$replacement'#g'
(該g
標誌用於允許替換每行的多個匹配項)。
另外,如果您在文件上運行 sed,則 sed 將不允許就地替換,這意味著您必須寫入臨時文件並將其移動。 更新:實際上,Gnu 的 sed做有一個就地選項,其工作方式類似於 Perl 的:-i
或者備份擴充在-i.ext
哪裡。.ext
但就可移植性而言,Perl 可能更可取。
對於就地替換,您可以使用 Perl,如下所示:
# In-place without backup:
perl -pi -e 's#/some/path#'$replacement'#g' <file>
# In-place with backup as .orig (note .orig is glued to the -i switch):
perl -pi.orig -e 's#/some/path#'$replacement'#g' <file>
請小心第二個命令,就好像您輸入兩次一樣,您將覆蓋您的第一個備份!