Вы должны использовать настоящий анализатор для получения значений из YAML или при обновлении файла YAML.
sed
просто не подходит для таких сложных операций, особенно если кто-то мигрирует
вставьте другую пару ключ-значение между строкой fields.type
и paths
или добавьте элемент в
последовательность, которая является значением для путей.
Учитывая ваш ввод в файл input.yaml
, с установленным ruamel.yaml
(pip install ruamel.yaml
) и сценарий:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
data = yaml.load(sys.stdin)
for item in data['filebeat.inputs']:
try:
ft = item['fields.type']
paths = item['paths']
for idx, path in enumerate(paths):
pre, post = path.rsplit('/', 1)
paths[idx] = pre + '/' + ft + '/' + post
except Exception as e:
print(e)
pass
yaml.dump(data, sys.stdout)
Вы можете сделать:
< input.yaml python update.py > output.yaml
чтобы получить:
filebeat.inputs:
- type: log
enabled: true
fields.type: spark
paths:
- /var/log/spark/*.log
- type: log
enabled: true
fields.type: kafka
paths:
- /var/log/kafka/*.log
Если в paths
есть несколько элементов, все они обновляются (при условии, что в пути есть хотя бы один /
).