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

如何用Shell的Sed命令按YAML规范替换并格式化字符串值

解决Sed替换YAML中jdbcUrl值时添加空格和单引号的问题

我来帮你搞定这个Sed替换YAML的问题——核心是要保留YAML严格的缩进格式,同时正确给替换值加上单引号,你的原有脚本没处理好这两点,试试下面的解决方案:

正确的替换脚本

DB_URL='jdbc:mysql://localhost:3306/sd?autoReconnect=true'
sed -i -e "s,^\(\s*jdbcUrl:\s*\)MYDATABASE,\1'$DB_URL',g" input.yaml

脚本细节解释

  1. 匹配缩进与键名:^\(\s*jdbcUrl:\s*\) 这部分会精准匹配以任意空格开头,紧接着是jdbcUrl:,再跟着任意空格的行首部分,并用括号捕获这个片段——这样就能保留YAML原有的缩进,不会破坏格式。
  2. 替换并添加单引号:\1'$DB_URL' 里的\1会把刚才捕获的缩进和键名部分原封不动放回去,然后用单引号把$DB_URL的值包裹起来,完美符合你想要的YAML格式。
  3. 双引号的作用:用双引号包裹Sed表达式,是为了让Shell能正确解析变量$DB_URL,同时处理URL里的特殊字符(比如?)。

输入与输出对比

输入YAML

- name: AP_DB
  description: "datasource"
  jndiConfig:
    name: jdbc/AP_DB
  definition:
    type: RDBMS
    configuration:
      jdbcUrl: MYDATABASE
      username: username
      password: password
      driverClassName: com.mysql.jdbc.Driver

执行脚本后的输出YAML

- name: AP_DB
  description: "datasource"
  jndiConfig:
    name: jdbc/AP_DB
  definition:
    type: RDBMS
    configuration:
      jdbcUrl: 'jdbc:mysql://localhost:3306/sd?autoReconnect=true'
      username: username
      password: password
      driverClassName: com.mysql.jdbc.Driver

额外注意事项

  • 如果你的DB_URL里包含单引号,需要先转义,比如把'替换成'\'',否则Sed会报错。
  • YAML对空格缩进非常敏感,绝对不能硬编码空格,用\s*捕获原有缩进是最安全的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:20:38