如何用sed动态修改Kubernetes Secret的stringData且不破坏文件格式?
问题描述
我正在编写bash脚本,用于动态修改Kubernetes Secret中的键值。目前用sed修改对应值,但输出文件的换行格式被破坏了。怎么让sed仅替换指定内容,同时不破坏原有文件格式?
原始YAML示例
apiVersion: v1 kind: Secret metadata: name: configs namespace: {{Namespace}} stringData: DOMAIN: {{Domain}} DB_USER: postgres DB_PASS: {{DBpass}}
当前脚本
original_yaml=$(cat chart.yam) # create new yaml file. modified_yaml=$(echo "$original_yaml" | sed "s/{{Namespace}}/$name/" | sed "s/{{NODE_COOKIE}}/$node_cookiee/" | sed "s/{{HubDomain}}/$hub_domain/" | sed "s/{{DBpass}}/$db_pass/" | sed "s/{{SmtpServer}}/$mail_server/" | sed "s/{{SmtpPort}}/$mail_port/" | sed "s/{{SmtpUser}}/$mail_user/" | sed "s/{{SmtpPass}}/$mail_pass/" | sed "s/{{UserEmail}}/$mail_email/"| ) echo $modified_yaml > render.yam
异常输出示例
apiVersion: v1 kind: Secret metadata: name: configs namespace: x stringData: DB_USER: postgres DB_PASS: x
解决办法
1. 修复换行丢失的核心问题
换行丢失的根源是未加引号的变量展开:echo $modified_yaml会让bash把变量里的换行、多空格自动替换成单个空格。只需给变量加双引号,就能保留原始格式:
echo "$modified_yaml" > render.yam
2. 合并多个sed命令(优化效率)
多个sed管道可以合并成一个,用-e参数指定多组替换规则,减少进程创建,提升脚本效率:
modified_yaml=$(echo "$original_yaml" | sed -e "s/{{Namespace}}/$name/" \ -e "s/{{NODE_COOKIE}}/$node_cookiee/" \ -e "s/{{HubDomain}}/$hub_domain/" \ -e "s/{{DBpass}}/$db_pass/" \ -e "s/{{SmtpServer}}/$mail_server/" \ -e "s/{{SmtpPort}}/$mail_port/" \ -e "s/{{SmtpUser}}/$mail_user/" \ -e "s/{{SmtpPass}}/$mail_pass/" \ -e "s/{{UserEmail}}/$mail_email/")
3. 更简洁的写法:直接用sed处理文件
如果不需要保留原始文件内容的变量,可直接让sed读取源文件并输出到目标文件,完全避免变量存储带来的格式问题:
sed -e "s/{{Namespace}}/$name/" \ -e "s/{{NODE_COOKIE}}/$node_cookiee/" \ -e "s/{{HubDomain}}/$hub_domain/" \ -e "s/{{DBpass}}/$db_pass/" \ -e "s/{{SmtpServer}}/$mail_server/" \ -e "s/{{SmtpPort}}/$mail_port/" \ -e "s/{{SmtpUser}}/$mail_user/" \ -e "s/{{SmtpPass}}/$mail_pass/" \ -e "s/{{UserEmail}}/$mail_email/" \ chart.yam > render.yam
注意事项
- 如果变量(如
$db_pass)包含斜杠/,需要把sed的分隔符换成其他字符(比如#),例如:s#{{DBpass}}#$db_pass# - 文件名建议统一修正为标准后缀
.yaml(脚本里的chart.yam、render.yam是拼写简化,容易引发混淆)
内容的提问来源于stack exchange,提问作者user22084183
相关产品推荐
相关产品推荐

