首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shell Scrip:将行拆分成具有相应键和值的数组/YAML格式

Shell Scrip:将行拆分成具有相应键和值的数组/YAML格式
EN

Stack Overflow用户
提问于 2020-02-25 10:39:14
回答 1查看 118关注 0票数 0

使用: Shell脚本

请帮助转换一个文件如下所示,到一个YAML格式,这将作为var文件使用的ansible攻略。

file:(它实际上是一个XML,我修剪了页眉/页脚,只过滤了所需的行)

代码语言:javascript
复制
   <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-addressstart-portend-port

我正在努力地将这些信息写入如下数组中。

代码语言:javascript
复制
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

请建议我可以使用的最好的方法来将其转换为上面所示的输出。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-25 11:44:26

这是我的方法,但是由于每个“元素”没有被组合到一个XML元素中,所以它不会以您想要的方式工作。您已经提到,您已经删除了一些行,这些行可能有助于产生更好的解决方案。

我将所有内容都封装在一个'data‘元素中,这是使其成为有效的XML文档所必需的。

代码语言:javascript
复制
<?xml version="1.0"?>
<data>
    <elementType>steering-pool</elementType>
    <attribute>
        <name>ip-address</name>
        <value>10.10.10.12</value>
    </attribute>
    ...
</data>

然后,您可以使用此脚本解析XML并将YAML文件打印到stdout。这种方法是可行的,但是当属性名称被重用时,这些值会被覆盖。

代码语言:javascript
复制
#!/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))

输出:

代码语言:javascript
复制
$ python parse.py
steering-pool:
- end-port: '100'
  ip-address: 10.10.10.14
  start-port: '80'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60386776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档