sed 用包含另一个 unix 路径的变量替换 unix 路径

sed 用包含另一个 unix 路径的变量替换 unix 路径

我需要在 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>

小心使用第二条命令,因为如果您输入两次,您将覆盖第一个备份!

相关内容