使用sed执行文件内容替换时遇&字符仅追加不替换如何解决
问题原因
sed的替换语法s/匹配模式/替换内容/中,替换内容段的&是特殊元字符,默认代表匹配模式命中的原文本片段。所以你的替换内容里包含&时,sed会自动把原匹配的orignaltxt插入到每个&的位置,最终呈现出「追加而非覆盖」的效果。
解决方案
方案1:继续使用sed(需提前转义特殊字符)
你需要先把替换内容里的所有&转义为\&,同时建议更换sed分隔符避免替换内容里包含/导致语法错误。
如果替换内容来自变量,修改后代码如下:
# 转义变量中的&字符 escaped_content=$(printf '%s' "$myvar" | sed 's/&/\\&/g') # 使用#作为分隔符执行替换,避免/冲突 sed -i "s#orignaltxt#$escaped_content#" file.yaml
如果替换内容已经存储在temp.txt文件中,可直接处理文件内容,无需从变量写入:
# 直接从temp.txt读取并转义内容 escaped_content=$(sed 's/&/\\&/g' temp.txt) sed -i "s#orignaltxt#$escaped_content#" file.yaml
注意:如果替换内容中还包含\、#等特殊字符,需要补充对应的转义规则。
方案2:使用Perl实现无转义替换(更推荐)
Perl的替换语法支持\Q标记自动转义所有特殊元字符,不需要手动处理任何特殊字符,适配任意包含单个&、连续&或其他特殊字符的替换场景,代码更简洁稳定:
# 导出变量供Perl读取 export myvar # 执行替换,\Q会自动转义所有特殊字符 perl -pi -e 's/orignaltxt/\Q$ENV{myvar}/' file.yaml
内容的提问来源于stack exchange,提问作者Tom Donnly
相关产品推荐
相关产品推荐

