搜索和在YAML使用壳牌格式替换字符串值

问题描述 投票:-1回答:1

我有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
sed yaml substitution
1个回答
2
投票

你似乎有那些似乎离解决这一阻碍你一些误解:

  • 输入文件是无效的YAML和更换MYDATABASE的是不会解决这个问题。你不能有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
  • 添加引号在shell分配给DB_URL值不有所作为
  • 你是不是使用shell,但sed进行更改。你的shell只是用来调用sed
  • 您调用sed-i这将覆盖input.yaml,这使得它很难看到,如果输出是正确的,你需要回滚所做的更改
  • 的空间没有前缀,这是通常需要遵循YAML值指示符(qazxsw POI)的空白
  • 你在你的匹配模式相匹配的空间,但你没有在你的替代模式,也没有在替代模式的任何报价。你可能觉得有周边:,但他们当然不是。
  • 在输出周围的URL的报价是多余的

如果你真的想输出为你指明有几个选项。首先,你可以只改变相关线路在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 多余的报价将被保留。

© www.soinside.com 2019 - 2024. All rights reserved.