【发布时间】:2019-02-09 15:44:03
【问题描述】:
我有 YAML 查找并用正确的 YAML 格式替换值(带空格和引号)。在 Sample YAML 下面,我可以使用下面的 Sed 命令替换 jdbcUrl 值。但是,需要帮助如何使用 Sed 为值添加空格和引号。 在 Sed 下面会找到并替换一个需要的 jdbcUrl。但是,它不会为空格(YAML 标准)添加前缀并添加值的引号。
查找和替换 URL 的脚本:
DB_URL='jdbc:mysql://localhost:3306/sd?autoReconnect=true'
sed -i -e 's, MYDATABASE,'$DB_URL',g' input.yaml
示例输入 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
【问题讨论】:
-
sed是错误的工具,如果你想保证输出总是有效的 YAML,或者相同输入文档的所有可能的公式都将被解析(YAML 有 很多 不同的方式来表示相同的内容,所以这是实践中的一个主要问题)。将yq视为解析和生成 YAML 的jq包装器。 -
@CharlesDuffy, Re "guarantee": 一个过度半正式且可能在教学上适得其反的吹毛求疵 --
sed是 @ 987654322@,因此必须有可能以某种方式编写sed代码来保证所需的输出,大概是通过使用条件分支来超越那些使其不适合解析 YAML 的limitations of regex。 (除此之外,sed对于这项工作来说是一个糟糕的工具。)
标签: sed yaml substitution