我在YAML(Cassandra)中有一个配置文件,我想更新其中的一些值。 你有任何关于允许我这样做的脚本的建议吗?也许是一些现有的例子?
INPUT:
cluster_name: 'CassandraCluster0'
initial_token:
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "127.0.0.1"
输出:
cluster_name: 'CassandraCluster0'
initial_token: 582023494802482234
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "10.12.3.4, 1.3.4.3"
答案 0 :(得分:0)
您当然可以使用sed
/ awk
/ perl
更新YAML文件中的文字,但与使用这些工具更新CSV,INI,XML,HTML一样,它们可能会失败在更复杂的例子中,价值观突然之间出现了#34;跨越多行,或者在语义上与工作相同,但不再包含相同的匹配字符串。
最好只使用编程语言和真正的解析器(这也是其他格式的推荐)。以下是使用Python和ruamel.yaml的方法,我是作者。因此,如果您的输入位于input.yml
,则:
import ruamel.yaml as yaml
data = yaml.load(open('input.yml'), Loader=yaml.RoundTripLoader)
data['initial_token'] = 582023494802482234
data['seed_provider'][0]['parameters'][0]['seeds'] = "10.12.3.4, 1.3.4.3"
print yaml.dump(data, Dumper=yaml.RoundTripDumper)
会得到你:
cluster_name: CassandraCluster0
initial_token: 582023494802482234
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: 10.12.3.4, 1.3.4.3
请注意,IP地址周围没有引号,因为它们不是必需的。精确控制样式是可能的,但不是很容易,只能在值周围加上(双)引号。围绕特定值更难以做到这一点,所以我希望这不是问题。
如果您必须经常为这两个值更新一组输入文件,您可以创建从命令行获取文件名,令牌和种子提供程序的脚本:
update_yml input.yml 582023494802482234 "10.12.3.4, 1.3.4.3"
和脚本update_yml
:
#! /usr/bin/env python
import sys
import ruamel.yaml as yaml
data = yaml.load(open(sys.argv[1]), Loader=yaml.RoundTripLoader)
data['initial_token'] = sys.argv[2]
data['seed_provider'][0]['parameters'][0]['seeds'] = sys.argv[3]
print yaml.dump(data, Dumper=yaml.RoundTripDumper)