sed 以包含另一個 unix 路徑的變數取代 unix 路徑

sed 以包含另一個 unix 路徑的變數取代 unix 路徑

我需要透過 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>

請小心第二個命令,就好像您輸入兩次一樣,您將覆蓋您的第一個備份!

相關內容