Shell变量在sed中需用双引号包裹并合理选界定符(如#、@、|),避免斜杠转义;含正则元字符时应转义或改用awk/perl字面替换;就地修改用-i,捕获结果用命令替换。

Shell变量不能直接在单引号的sed命令中展开,因为单引号会屏蔽所有特殊字符。必须用双引号包裹sed表达式,并确保变量名不被误解析。
用双引号包裹并正确引用变量
Shell变量在双引号内可正常展开,但要注意斜杠、点号等特殊字符可能干扰sed匹配。推荐使用非斜杠定界符(如#、|、@)避免转义麻烦。
- 基础写法:
sed "s#$old#$new#g" file,其中$old和$new是已定义的变量 - 若变量含空格或特殊字符,建议加花括号:
sed "s#${old_pattern}#${new_value}#g" config.txt - 避免变量为空导致语法错误,可先检查:
[ -n "$old_pattern" ] && sed "s#${old_pattern}#${new_value}#g" file
处理含斜杠路径或URL的变量
当变量值本身含大量/(如路径/usr/local/bin或URLhttp://example.com),继续用/作定界符会导致混乱甚至报错。
- 改用
@:sed "s@${OLD_PATH}@${NEW_PATH}@g" nginx.conf - 或用
|:sed "s|${URL_OLD}|${URL_NEW}|g" links.html - 不推荐对斜杠转义(如
\/),易出错且可读性差
安全替换:防止正则元字符被误解释
如果变量内容来自用户输入或配置文件,可能含.、*、[等正则元字符,直接插入sed会导致意外匹配。
- 简单方案:用
printf '%q'转义变量(适用于Bash 4.3+):escaped_old=$(printf '%q' "$old"),再代入sed "s#${escaped_old}#${new}#g" - 更稳妥做法:改用
awk做字面量替换(不解析正则):awk -v old="$old" -v new="$new" '{gsub(old, new)} 1' file - 或借助
perl(支持字面量匹配):perl -pe "s/\Q$old\E/$new/g" file
就地修改与结果捕获
需要修改原文件时加-i;若只是测试或需后续处理,建议先输出到变量或临时文件。
- 就地替换:
sed -i "s#${key}#${val}#g" settings.conf - 捕获结果到变量:
result=$(sed "s#${src}#${dst}#g" input.txt) - 带错误检查:
if ! sed -i "s#${var}#${val}#g" "$file" 2>/dev/null; then echo "替换失败"; fi


















