Shell Scrip: разбить строки на массив / YAML формат с соответствующим ключом и значениями - PullRequest
0 голосов
/ 25 февраля 2020

Использование: Shell Script

Помогите, пожалуйста, преобразовать файл, показанный ниже, в формат YAML, который вы хотели бы использовать в качестве var файла для ansible playbook.

file: (на самом деле это был XML, я обрезал верхний / нижний колонтитул и отфильтровал только необходимые строки)

   <elementType>steering-pool</elementType>
   <attribute>
    <name>ip-address</name>
    <value>10.10.10.12</value>
   </attribute>
   <attribute>
    <name>start-port</name>
    <value>60</value>
   </attribute>
   <attribute>
    <name>end-port</name>
    <value>100</value>
   </attribute>
   <elementType>steering-pool</elementType>
   <attribute>
    <name>ip-address</name>
    <value>10.10.10.13</value>
   </attribute>
   <attribute>
    <name>start-port</name>
    <value>70</value>
   </attribute>
   <attribute>
    <name>end-port</name>
    <value>100</value>
   </attribute>
   <elementType>steering-pool</elementType>
   <attribute>
    <name>ip-address</name>
    <value>10.10.10.14</value>
   </attribute>
   <attribute>
    <name>start-port</name>
    <value>80</value>
   </attribute>
   <attribute>
    <name>end-port</name>
    <value>100</value>
   </attribute>

Количество элементов может отличаться, например, в приведенном выше файле три и каждый элемент имеет ip-address, start-port, end-port.

Я изо всех сил пытаюсь записать эту информацию в массив, как показано ниже.

steering-pool:
    ip-address:10.10.10.12 start-port:60 end-port:100
    ip-address:10.10.10.13 start-port:70 end-port:100
    ip-address:10.10.10.14 start-port:80 end-port:100

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

СПАСИБО заранее.

1 Ответ

0 голосов
/ 25 февраля 2020

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

Я заключил все в элемент 'data', который требовался, чтобы сделать его действительным XML document.

<?xml version="1.0"?>
<data>
    <elementType>steering-pool</elementType>
    <attribute>
        <name>ip-address</name>
        <value>10.10.10.12</value>
    </attribute>
    ...
</data>

Затем вы можете использовать этот скрипт для анализа XML и распечатки файла YAML на стандартный вывод. Это работает, но значения перезаписываются при повторном использовании имени атрибута.

#!/usr/bin/env python

import yaml
import xml.etree.ElementTree

tree = xml.etree.ElementTree.parse('file.xml')
root = tree.getroot()
data = {'steering-pool': []}

d = {}
for attribute in root.findall('attribute'):
    d[attribute.find('name').text] = attribute.find('value').text
data['steering-pool'].append(d)

print(yaml.safe_dump(data, default_flow_style=False))

Вывод:

$ python parse.py
steering-pool:
- end-port: '100'
  ip-address: 10.10.10.14
  start-port: '80'
...