Awk 替换包含特殊字符的句子&

Awk 替换包含特殊字符的句子&,awk,sed,Awk,Sed,在bash脚本中: 我想用以下url替换html文件中出现的单词“test”: 网址=http://www.test.com/testcom&_mc_jhc=ex_XZ-r&oh=044 搜索测试' 行政长官: sed-i.original's |'${search}'|'${url}'| g'index.html 它可以工作,但也可以用“test”替换所有& 用awk试过: awk'{sub/test/,'${url}'}1' 但同样的问题 为什么url中的&in也被test替换 有什么解决办

在bash脚本中:

我想用以下url替换html文件中出现的单词“test”: 网址=http://www.test.com/testcom&_mc_jhc=ex_XZ-r&oh=044

搜索测试'

行政长官: sed-i.original's |'${search}'|'${url}'| g'index.html

它可以工作,但也可以用“test”替换所有&

用awk试过: awk'{sub/test/,'${url}'}1'

但同样的问题

为什么url中的&in也被test替换


有什么解决办法吗?

答案是:

replaceEscaped=$(sed 's/[&/\]/\\&/g' <<<"$url") # escape it


sed -i'.original' 's|'"${search}"'|'"${replaceEscaped}"'|g' index.html

这个问题我已经碰到过好几次了;尝试sed s |${search}|${url}| g index.html>updated_index.html&这是sed中的一个特殊字符,您需要使用反斜杠对其进行转义。请参阅,特别是转义字符串文本以用作sed///命令中的替换字符串的部分。由于您使用的是不同的分隔符|而不是/,因此您必须调整模式以使其正确转义。@GordonDavisson非常感谢您!!!你帮我节省了很多时间,您的解决方案非常有效:如果您想使用sed,请参见,但就我个人而言,我会使用awk,但要使用index和substr等字符串函数,而不是sub等regexp函数,因为您似乎想用另一个文本字符串替换一个文本字符串,而不是用支持反向引用的文本替换regexp分隔符而不是/,您应该将|添加到要转义的字符列表中并删除/:sed的/[&| \]/\\&/g'