Замените содержимое файла yml, используя sed с несколькими ключами с одинаковыми именами. - PullRequest
0 голосов
/ 29 марта 2019

Я хочу заменить путь каждого журнала в файле yml, ниже мой файл

filebeat.inputs:

- type: log
  enabled: true
  fields.type: spark
  paths:
    - /var/log/*.log

- type: log
  enabled: true
  fields.type: kafka
  paths:
    - /var/log/*.log

Я понятия не имею, как заменить значение, имеющее несколько одинаковых типов, например -type: log InДля примера файла я использовал следующую строку:

sed -i -e '/^ *ssl:/,/^ *[^:]*:/s/enabled: true/enabled: false/' test2.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

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вы не можете достичь этого напрямую с помощью команды sed.Вам нужно выполнить синтаксический анализ YAML и, в зависимости от ваших требований, вызвать необходимые команды sed для проанализированных данных.

0 голосов
/ 30 марта 2019

Вы должны использовать настоящий анализатор для получения значений из 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 есть несколько элементов, все они обновляются (при условии, что в пути есть хотя бы один /).

...