为了账号安全,请及时绑定邮箱和手机立即绑定

转义sed替换模式的字符串

转义sed替换模式的字符串

转义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的评论。

编辑:由于以前没有考虑到一些角落情况,上面的命令已经更改了好几次。


查看完整回答
反对 回复 2019-06-05
?
HUWWW

TA贡献1874条经验 获得超12个赞

替换子句中专门处理的三个文字字符是/(终止该条文)\(转义字符,反向引用,&c.)&(将匹配包括在替换项中)。因此,您所需要做的就是转义这三个字符:

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


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 1232 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信