如何在sed中转义字符串变量?
将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
/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变量没有严格验证,不仅容易出错,而且不安全。