我有YAML查找和使用正确的YAML格式(空间和引号)替换值。下面的示例YAML,我能够代替使用下面的sed命令JDBCURL值。但是,需要帮助如何使用前缀桑达价值的空间和报价。下面桑达将查找并替换所需的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
你似乎有那些似乎离解决这一阻碍你一些误解:
name
和标量值在同一时间的映射(从关键description
)。我假设你的文件需要如下所示:
- 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
DB_URL
值不有所作为sed
进行更改。你的shell只是用来调用sed
sed
与-i
这将覆盖input.yaml
,这使得它很难看到,如果输出是正确的,你需要回滚所做的更改:
,但他们当然不是。如果你真的想输出为你指明有几个选项。首先,你可以只改变相关线路在YAML包括引号
$DB_URL
而稍微改变你的 jdbcUrl: 'MYDATABASE'
命令:
sed
如果你不能改变sed -e 's,MYDATABASE,'$DB_URL',g' < input.yaml
,你可以添加引号(和空间)sed的替换:
input.yaml
或不使用单引号,和concacatenate前缀和后缀,以sed -e 's, MYDATABASE, "'$DB_URL'",g' < input.yaml
但使用双引号,这确实允许$DB_URL
进行扩展:
$DB_URL
一旦你验证这些解决方案的工作,你可以重新添加就地replacment选项sed -e "s, MYDATABASE, '$DB_URL',g" < input.yaml
到-i
。
sed
是不正确的一种工具为此,特别是不能因为你似乎不熟悉它,并YAML。使用合适解析器YAML做这类事情。他们倾向于保持工作时,简单的模式匹配不再能够完成任务。而且,解析器的倾销机制,知道什么时候插入引号代替默默地将它们并不需要它们时。解析器也会表明您输入无效YAML从一开始。
这是多一点的代码来做到这一点如在Python,但至少它只匹配正是你替换字符串映射值,而不会尝试做键替代,序列项,YAML注释中,或像sed
映射值,如果这些恰好是在文件。防止从使用ORIG_MYDATABASE
可能是相当大的挑战发生。
这样的Python程序可能看起来像sed
:
subst.py
并从外壳调用,就像import sys
from pathlib import Path
from ruamel.yaml import YAML
val = sys.argv[1]
subst = sys.argv[2]
file_name = Path(sys.argv[3])
def update(d, val, sub):
if isinstance(d, dict):
for k in d:
v = d[k]
if v == val:
d[k] = sub
else:
update(v, val, sub)
elif isinstance(d, list):
for item in d:
update(item, val, sub)
yaml = YAML()
yaml.preserve_quotes = True # to preserve superfluous quotes in the input
data = yaml.load(file_name)
update(data, val, subst)
yaml.dump(data, file_name)
必须是,通过使用:
sed
当然,也会有在周围的URL输出中没有报价,因为他们是在输入文件中多余的,而不是,而是围绕python subst.py MYDATABASE $DB_URL input.yaml
多余的报价将被保留。