You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sed命令将脚本中的变量替换为公私证书内容

sed替换证书内容报错解决方案

报错原因

证书文件包含换行符、斜杠/等特殊字符,直接传入sed的s命令作为替换值时,要么会提前截断分隔符,要么换行符会打断命令结构,因此会抛出unterminated 's' command错误。
sed本身不支持直接传入未转义的多行/含特殊字符的变量作为替换值,必须提前处理特殊字符,操作较为繁琐,推荐以下两种更简便的实现方案:


方案1:用awk实现(无需手动转义,推荐)

awk原生支持传入多行变量,无需额外处理特殊字符即可完成替换:

替换公钥变量

# 通用方案(兼容所有awk版本,需要临时文件中转)
sudo awk -v crt="$(sudo cat /data/harbor.crt)" '{gsub(/CFG_HARBOR_CRT="[^"]*"/, "CFG_HARBOR_CRT=\""crt"\"")}1' template-script.sh > tmp_file && sudo mv tmp_file template-script.sh

如果使用GNU Awk 4.1及以上版本,可直接用内置的原地修改参数:

sudo awk -i inplace -v crt="$(sudo cat /data/harbor.crt)" '{gsub(/CFG_HARBOR_CRT="[^"]*"/, "CFG_HARBOR_CRT=\""crt"\"")}1' template-script.sh

替换私钥变量

# 通用方案
sudo awk -v key="$(sudo cat /data/harbor.key)" '{gsub(/CFG_HARBOR_KEY="[^"]*"/, "CFG_HARBOR_KEY=\""key"\"")}1' template-script.sh > tmp_file && sudo mv tmp_file template-script.sh

# GNU Awk 4.1+ 原地修改版本
sudo awk -i inplace -v key="$(sudo cat /data/harbor.key)" '{gsub(/CFG_HARBOR_KEY="[^"]*"/, "CFG_HARBOR_KEY=\""key"\"")}1' template-script.sh

方案2:坚持用sed的实现(需提前转义特殊字符)

如果必须使用sed完成操作,需要先对证书内容的特殊字符做转义处理,同时更换sed分隔符避免和证书内的斜杠冲突:

# 转义证书内容的换行、特殊符号
HARBOR_CRT_ESCAPED=$(sudo cat /data/harbor.crt | sed ':a;N;$!ba;s/\n/\\n/g;s/[\/&]/\\&/g')
HARBOR_KEY_ESCAPED=$(sudo cat /data/harbor.key | sed ':a;N;$!ba;s/\n/\\n/g;s/[\/&]/\\&/g')

# 用#作为s命令分隔符执行替换
sudo sed -i "s#CFG_HARBOR_CRT=\"[^\"]*\"#CFG_HARBOR_CRT=\"$HARBOR_CRT_ESCAPED\"#g" ./template-script.sh
sudo sed -i "s#CFG_HARBOR_KEY=\"[^\"]*\"#CFG_HARBOR_KEY=\"$HARBOR_KEY_ESCAPED\"#g" ./template-script.sh

内容的提问来源于stack exchange,提问作者Manitoba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:15:03