我需要通过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了两次,你将覆盖你的第一个备份!