如何使用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
相关产品推荐
相关产品推荐

