如何用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
脚本细节解释
- 匹配缩进与键名:
^\(\s*jdbcUrl:\s*\)这部分会精准匹配以任意空格开头,紧接着是jdbcUrl:,再跟着任意空格的行首部分,并用括号捕获这个片段——这样就能保留YAML原有的缩进,不会破坏格式。 - 替换并添加单引号:
\1'$DB_URL'里的\1会把刚才捕获的缩进和键名部分原封不动放回去,然后用单引号把$DB_URL的值包裹起来,完美符合你想要的YAML格式。 - 双引号的作用:用双引号包裹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
相关产品推荐
相关产品推荐

