在sed脚本中引用Shell外部变量需用双引号使Shell展开变量,避免单引号锁定;含特殊字符时应换分隔符(如#、|)或提前转义,.sed文件须通过-e拼接或env注入变量。
在 sed 脚本中引用 Shell 外部变量实现动态在线替换,关键在于正确展开变量并规避特殊字符干扰。直接使用双引号包裹命令、对变量做必要转义或使用间接方式(如 env + sed -e)是常用且可靠的做法。
sed 本身不解析 Shell 变量,必须靠 Shell 先展开再传给 sed。单引号会锁死变量,双引号才允许 $VAR 被替换:
sed "s/$old/$new/g" file
sed 's/$old/$new/g' file(变量不展开)注意:若 $old 或 $new 含 /、&、 等 sed 特殊字符,会导致语法错误或意外替换。此时需提前转义或换分隔符。
当变量值含斜杠 /(如路径 /usr/bin)时,改用其他分隔符可避免冲突:
# 替代 /:sed "s#$old#$new#g" file
|:sed "s|$old|$new|g" file
若变量含反斜杠或 &,需在赋值前转义(如 new=${new///\}),或改用 printf %q 安全转义(较重,适合复杂场景)。
纯 .sed 文件无法直接读取 Shell 变量,需通过 -e 拼接或环境变量注入:
sed -e "s/$pattern/$replacement/g" script.sed(把变量嵌入命令行)env 传参:old="$old" new="$new" sed 's/'"$old"'/'"$new"'/g' file,或更稳妥地:old="$old" new="$new" sed 's/x00/'"$new"'/g' (极少用,仅作示意)
推荐做法是将变量逻辑保留在 Shell 脚本中,用双引号调用 sed,而非硬塞进独立 .sed 文件。
未校验的变量可能引发空替换(s//g 删除所有行)或注入风险:
[ -n "$old" ] && [ -n "$new" ] && sed "s|$old|$new|g" file
old=${old%/}(删末尾斜杠)printf '%q' 或专用工具(如 sed_escape 函数)转义不复杂但容易忽略细节。变量展开、分隔符选择、内容校验,三者到位就基本稳了。