我需要在 bash 脚本中用包含另一个 unix 路径的变量替换 sed 中的 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,它将不允许就地替换,这意味着您必须写入临时文件并将其移动。 更新:实际上,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>
小心使用第二条命令,因为如果您输入两次,您将覆盖第一个备份!