Конечно, вы можете обновить текст в файле YAML с помощью sed
/ awk
/ perl
, но, как и при обновлении 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)