sed用包含另一个unixpath的variablesreplaceunixpath

我需要通过sedreplaceUnixpath,在bash脚本中包含另一个unixpath的variables

例:

another_unix_path=/another/unix/path sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt 

您需要转义特殊字符:

 another_unix_path="\/another\/unix\/path" echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g' 

哪一个输出这个结果:

/另一个/ UNIX /path

转义特殊字符/是一个选项。

您也可以通过使用?更改默认的sed分隔符(即/? 例如 :

 another_unix_path="/another/unix/path" echo /some/path/file.txt | sed -e 's?/some/path/file.txt?'$another_unix_path'?g' 

s标志后面使用的char定义了将使用哪个分隔符: 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 

如果你使用/作为分隔符,那么你将不得不在你的path中的每一个/ ex sed 's/\/some\/path/'$replacement'/g'

幸运的是,类似于Perl的sed允许使用许多字符作为分隔符,所以你也可以编写sed 's#/some/path#'$replacement'#g'g标志用于允许每行replace多次) 。

另外sed将不允许就地更换,如果你在一个文件上运行它,这意味着你将不得不写入临时文件,并将其移动。 更新:实际上,Gnu的sed 确实有一个像Perl一样工作的就地选项: -i-i.ext ,其中.ext是备份扩展。 尽pipePerl可能更适合于可移植性。

对于就地更换,您可以使用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> 

要小心第二个命令,就好像你input了两次,你将覆盖你的第一个备份!