2011-11-09 4 views
1

YAML(Cassandra)に設定ファイルがあります。その中にいくつかの値を更新したいと思います。 これを可能にするスクリプトの提案はありますか?おそらくいくつかの既存の例ですか?Linux:yamlファイルの値を更新する

INPUT:

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アドレスの周りに存在しませんのでご注意ください。値の周りに二重引用符だけを置くようにスタイルを細かく制御することは可能ですが、それほど簡単ではありません。特定の値を中心にするのはさらに難しいので、これは問題ではないことを願っています。

あなたはこれらの2つの値の入力ファイルのセットを更新する必要がある場合は、多くの場合、ファイル名をとり、スクリプト、コマンドラインからのトークンとシードプロバイダ作ることができます。

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) 
関連する問題