如何在sed中转义字符串变量?

如何在sed中转义字符串变量?,sed,Sed,将sed中的/tmp/storequote替换为/tmp/tmpdata: sudo sed -i "s/\/tmp\/storequote/\/tmp\/tmpdata/g" config.py 它工作正常,/被\转义。我想使用在sed中包含特殊字符的字符串变量 string1='/tmp/tmpdata' string2='/tmp/storequote' sudo sed -i "s/$string1/$string2/g" config.py

将sed中的
/tmp/storequote
替换为
/tmp/tmpdata

sudo sed -i "s/\/tmp\/storequote/\/tmp\/tmpdata/g" config.py
它工作正常,
/
\
转义。我想使用在sed中包含特殊字符的字符串变量

string1='/tmp/tmpdata'
string2='/tmp/storequote'
sudo sed -i "s/$string1/$string2/g"  config.py
它遇到了一个问题:

sed: -e expression #1, char 8: unknown option to `s'

如何修复它?

Sed允许您在替换中使用除
/
之外的其他分隔符

例如,使用冒号:

sudo sed -i "s:$string1:$string2:g"  config.py
现在假设
string1
(或
string2
)包含冒号,您将再次得到一个中断的sed命令。如果它们包含分号,则相同,分号用于分隔
sed
命令

如果您使用bash,一个容易转义这些特殊字符的解决方案是仔细选择一个对bash有特殊意义的分隔符(如
|
),并使用
printf%q
,它将为您转义,同时保持您的命令可读性:

printf -v sed_command 's|%q|%q|g' "$string1" "$string2"
sudo sed -i "$sed_command" config.py

警告:此攻击不会转义
string1
中的点字符,因为它们将保留其特殊含义(即任何字符)。请记住,这是一种可以避免因可能的特殊字符而头痛的方法。

简单而常见的解决方法是为
s
命令使用一个可选的分隔符,例如
s|$string1 |$string2 | g
。也就是说,我建议您在使用动态sed表达式时要非常小心,因为如果shell变量没有严格验证,不仅容易出错,而且不安全。