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