无法使用 sed 替换路径

无法使用 sed 替换路径

如何使用 sed 命令将文件中的一条路径替换为另一条路径,并且当它在脚本中用作变量时它可以起作用。

sed -i "s/"system_filter = /etc/define_filter_file"/"system_filter = /usr/local/etc/file_regex"/g" /etc/exi.conf.bak

答案1

您需要转义所提供路径中的所有斜杠,并将开始和结束引号更改为单引号。

sed -i 's/"system_filter = \/etc\/define_filter_file"/"system_filter = \/usr\/local\/etc\/file_regex"/g' /etc/exi.conf.bak

该命令表达为:

sed -i 's/path1/path2/g'

Path1 和 path2 不能明确包含,/因为这会与整个表达式混淆。

答案2

来自 GNU sed 的 infotex 手册(参见info sed):

s(替代)命令 的语法是s/REGEXP/REPLACEMENT/FLAGS/字符可以统一 被任何其他单个字符替换1在任何给定s命令中。该/字符(或代替该字符的任何其他字符)只有在其前面有一个\ 字符时才能出现在 REGEXP 或 REPLACEMENT 中。

即用作|REGEXP 和替换之间的分隔符,sed 命令变为:

sed -i 's|"system_filter = /etc/define_filter_file"|"system_filter = /usr/local/etc/file_regex"|g' /etc/exi.conf.bak

或者简而言之:

sed s|/some/path|/alternate/path/|

这比其他方法容易得多,可以避免大量的正斜杠:

sed s/\/some\/path/\/alternate\/path\//

1. sedOSX 的手册页明确排除了反斜杠\和换行符,不再符合上述条件)“任何其他单个字符”

相关内容