任务:
我正在尝试使用Shell脚本从xml标记中获取属性值,将值分割并将其保存在.csv文件中。
这是xml的样子:
<host>
<servers>
<server name="Type1Name1-Port1" >...</server>
<server name="Type2Name2-Port2" >...</server>
<server name="Type3Name3-Port3" >...</server>
...
<server name="TypexNamex-Portx" >...</server>
</servers>
</host>
我想从“名称”属性中获取值并将其拆分,如下所示:
Type;Name;Port
我想要的输出csv文件应如下所示:
Type1;Name1;Port1
Type2;Name2;Port2
Type3;Name3;Port3
...
Typex;Namex;Portx
问题:
我可以使用我想要的任何外壳语言。我更喜欢bash和ksh。
我的问题:
编辑:
服务器名称的示例数据:
T-TTT_AAA-A-SSS-PPPP
其中T代表类型,A代表应用程序名称,S代表服务器名称,P代表端口。T,A和S的长度是可变的。P是常数。
这是我想出的,仅使用通用工具:xmllint
和sed
:
echo 'cat //host/servers/server/@name' | xmllint --shell data.xml | sed -n 's: name=\"\([A-Z][a-z0-9]*\)\([A-Z][a-z0-9]*\)-\(.*\)\":\1,\2,\3:p'
该sed
部分在发布时根据OP的示例完成。
分解:
echo 'cat //host/servers/server/@name'
:我们将此命令传递给xmllint
。它将捕获name
内部所有节点的属性<host><servers><server ...> ... </server></servers></hosts>
xmllint --shell data.xml
:迭代data.xml
并执行在交互式shell中作为参数传递的命令。sed -n 's: name=\"\([A-Z][a-z0-9]*\)\([A-Z][a-z0-9]*\)-\(.*\)\":\1;\2;\3:p'
:我们处理的输出xmllint
以仅保留我们感兴趣的数据
xmllint
将产生以下输出: name="Type1Name1-Port1"
Type
)之外的任何字符,另一个大写字母后跟除大写字母(for Name
)之外的任何字符,以及在-
和"
字符之间的任何字符输出 :
Type1;Name1;Port1
Type2;Name2;Port2
Type3;Name3;Port3
Typex;Namex;Portx
编辑:
要适应您在注释中指示的模式,只需更改sed正则表达式,例如:
sed -n 's: name=\"\(.*\)_\(.*\)-\(.\{4\}\)\":\1,\2,\3:p'
这将与format匹配T-TTT_AAA-A-SSS-PPPP
,并具有类型和服务器名称的任何长度。尝试摆弄正则表达式或在regex
代码中问另一个问题,如果这不是您所需要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句