转义sed替换模式的字符串

转义sed替换模式的字符串

在bash脚本中,我有一个外部字符串(从用户那里接收),我应该在sed模式中使用它。

REPLACE="<funny characters here>"
sed "s/KEYWORD/$REPLACE/g"

我怎么才能逃过$REPLACE字符串,以便安全地被sed作为字面上的替代?

注:这个KEYWORD是没有匹配等的哑子字符串。它不是由用户提供的。


一只甜甜圈
浏览 1285回答 3
3回答

绝地无双

注意,逃避一切都是个坏主意。SED需要将许多字符转义到到达它们的特殊意义。例如,如果您在替换字符串中转义一个数字,它将转到一个反向引用。正如本·布兰克(Ben Blank)所说,在替换字符串中只需要转义三个字符(转义本身、语句结尾处的正斜杠和替换ALL):sed -e 's/[\/&]/\\&/g'如果您需要逃离KEYWORD字符串,下面是您需要的字符串:sed -e 's/[]\/$*.^[]/\\&/g'记住,如果你使用的字符不是/作为分隔符,需要使用所使用的字符替换上述表达式中的斜杠。有关解释,请参见PeterJClaw的评论。编辑:由于以前没有考虑到一些角落情况,上面的命令已经更改了好几次。

HUWWW

替换子句中专门处理的三个文字字符是/(终止该条文)\(转义字符,反向引用,&c.)&(将匹配包括在替换项中)。因此,您所需要做的就是转义这三个字符:sed&nbsp;"s/KEYWORD/$(echo&nbsp;$REPLACE&nbsp;|&nbsp;sed&nbsp;-e&nbsp;'s/\\/\\\\/g;&nbsp;s/\//\\\//g;&nbsp;s/&/\\\&/g')/g"例子:$&nbsp;export&nbsp;REPLACE="'\"|\\/><&!" $&nbsp;echo&nbsp;fooKEYWORDbar&nbsp;|&nbsp;sed&nbsp;"s/KEYWORD/$(echo&nbsp;$REPLACE&nbsp;|&nbsp;sed&nbsp;-e&nbsp;'s/\\/\\\\/g;&nbsp;s/\//\\\//g;&nbsp;s/&/\\\&/g')/g" foo'"|\/><&!bar
打开App,查看更多内容
随时随地看视频慕课网APP