2011-11-09 24 views
1

我在YAML(Cassandra)中有一個配置文件,我想更新其中的一些值。 您對腳本有任何建議,可以讓我這樣做嗎?也許一些現有的例子?Linux:更新yaml文件中的值

輸入:

cluster_name: 'CassandraCluster0' 
initial_token: 
seed_provider: 
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider 
     parameters: 
      - seeds: "127.0.0.1" 

OUTPUT:

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

我不明白,你不能輕易地用你喜歡編碼的任何語言來做到這一點嗎?就個人而言,我會使用perl甚至只是sed。你嘗試過什麼問題? – derobert

回答

0

您可以用sed/awk/perl在YAML文件當然更新的文字,但與更新CSV,INI,XML,HTML使用這些工具,他們會在更復雜的例子中失敗,這些例子中「突然間出現」的值橫跨多行,或者在語義上與有效的相同,但不再由相同的匹配字符串組成。

最好只使用一種編程語言和一個真正的解析器(這也是對其他格式的建議)。下面是你如何使用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)