转义sed替换模式的字符串在bash脚本中,我有一个外部字符串(从用户那里接收),我应该在sed模式中使用它。REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"我怎么才能逃过$REPLACE字符串,以便安全地被sed作为字面上的替代?注:这个KEYWORD是没有匹配等的哑子字符串。它不是由用户提供的。
3 回答
绝地无双
TA贡献1946条经验 获得超4个赞
注意,逃避一切都是个坏主意。SED需要将许多字符转义到到达它们的特殊意义。例如,如果您在替换字符串中转义一个数字,它将转到一个反向引用。
正如本·布兰克(Ben Blank)所说,在替换字符串中只需要转义三个字符(转义本身、语句结尾处的正斜杠和替换ALL):
sed -e 's/[\/&]/\\&/g'
如果您需要逃离KEYWORD
字符串,下面是您需要的字符串:
sed -e 's/[]\/$*.^[]/\\&/g'
记住,如果你使用的字符不是/
作为分隔符,需要使用所使用的字符替换上述表达式中的斜杠。有关解释,请参见PeterJClaw的评论。
编辑:由于以前没有考虑到一些角落情况,上面的命令已经更改了好几次。
HUWWW
TA贡献1874条经验 获得超12个赞
/
\
&
sed "s/KEYWORD/$(echo $REPLACE | sed -e 's/\\/\\\\/g; s/\//\\\//g; s/&/\\\&/g')/g"
$ export REPLACE="'\"|\\/><&!" $ echo fooKEYWORDbar | sed "s/KEYWORD/$(echo $REPLACE | sed -e 's/\\/\\\\/g; s/\//\\\//g; s/&/\\\&/g')/g" foo'"|\/><&!bar
添加回答
举报
0/150
提交
取消