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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:00:27