sed替换中&为何被替换为无效文本?bash场景下的技术疑问
问题原因分析
你的sed命令出错核心是变量里的&被sed当成了特殊元字符:
- sed的替换语法中,
&代表「匹配到的整个目标字符串」,也就是你要替换的{URL_TO_CHANGE}。 - 你用双引号包裹sed命令时,bash会先展开
$line_item变量,把其中的&直接传给sed。sed遇到&就自动替换成匹配到的{URL_TO_CHANGE},所以原本的&被处理成了{URL_TO_CHANGE}amp;,最终出现你看到的混乱结果。
解决办法
方法1:转义变量中的&
先把变量里的&转义成\&,让sed把它当成普通字符:
# 转义变量中的特殊字符(包括&和可能的\) escaped_url=$(echo "$line_item" | sed 's/\\/\\\\/g; s/\&/\\\&/g') # 执行替换 sed -e "s/{URL_TO_CHANGE}/$escaped_url/" path/to/file.xml
方法2:直接在sed命令中处理转义
不用提前定义转义变量,直接在替换时动态转义:
sed -e "s/{URL_TO_CHANGE}/$(echo "$line_item" | sed 's/&/\\\&/g')/" path/to/file.xml
方法3:用awk替换(更省心)
awk对特殊字符的兼容性更好,不需要手动转义&:
awk -v target_url="$line_item" '{gsub(/{URL_TO_CHANGE}/, target_url)}1' path/to/file.xml
额外注意
sed的替换分隔符尽量不要用空格(容易引发语法歧义),推荐用/、#这类不会出现在目标字符串里的字符,比如:
sed -e "s#{URL_TO_CHANGE}#$escaped_url#" path/to/file.xml
内容的提问来源于stack exchange,提问作者jake wong
相关产品推荐
相关产品推荐

