Linux:更新yaml文件中的值

时间:2011-11-09 23:16:22

标签: linux yaml

我在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"

1 个答案:

答案 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)