【发布时间】:2017-03-10 06:45:47
【问题描述】:
我有数百个 YAML 文件需要不时更新。
更新前:
sss:
- ccc:
brr: 'mmm'
jdk: 'openjdk8'
- bbb:
brr: 'rel/bbb'
jdk: 'openjdk8'
- aaa:
brr: 'rel/aaa'
jdk: 'openjdk7'
更新后:
sss:
- ddd:
brr: 'mmm'
jdk: 'openjdk8'
- ccc:
brr: 'rel/ccc'
jdk: 'openjdk8'
- bbb:
brr: 'rel/bbb'
jdk: 'openjdk8'
- aaa:
brr: 'rel/aaa'
jdk: 'openjdk7'
- 对于任何文件中出现以下模式的任何情况:
sss: - ccc: brr: 'mmm'
- 替换并修改上述模式,将
'mmm'替换为'rel/ccc':
- ccc: brr: 'rel/ccc'
- 按以下格式创建新的子字符串(多行):
- new: brr: 'new-mmm' jdk: 'openjdk8'
- 结合 2. 和 3. 并将原始文件替换为:
sss: - new: brr: 'mmm' jdk: 'openjdk8' - ccc: brr: 'rel/ccc' jdk: 'openjdk8'
例如,我们需要更新上述文件,使其看起来像保留每行中的空格/制表符,因为格式对 YAML 很重要。
我已经用 PyYAML 尝试过这个,但由于语法的复杂性,它不起作用。这可以通过使用 awk, sed 捕获空白来完成吗?
【问题讨论】:
-
你可以看看SO: Shell scripting - split xml into multiple files。在那里您可以看到如何使用变量在多种模式之间“切换 awk 解析”。
-
您需要提供更多有关替换/添加的信息。添加不存在的第二级很容易理解。例如:您将它放在节的开头,但可以将其添加到同一节的末尾吗?
-
我们可以假设从示例 2 中删除
sss:是一个错误吗? -
捕获空白是什么意思?
brr: 'mmm'的缩进级别是否足以识别所有需要替换的位置? -
@Anthon: sss 可以被删除,但它必须用作搜索字符串的起点。因此,缩进可能会有所不同,我想捕获空格/制表符并在更新的多行字符串中重新引入它们。