使用bash将XML转换为管道分隔文件

时间:2014-05-28 15:41:10

标签: xml bash

如何删除条目标记并将此XML转换为竖线分隔文件?

<entry><company>ABC</company><appname>XYZ</appname><appid>12345678</appid><updated>2014-04-29T20:58:00-07:00</updated><msgid>923605123</msgid><title>Crash</title><content type="text">Whenever you try to use the graph function.  I expect better from Schwab</content><version>4.1.3.6</version><rating>1</rating></entry>

预期输出格式:

ABC|XYZ|12345678|2014-04-29T20:58:00-07:00|923605123|Crash|Whenever you try to use the graph function.  I expect better from Schwab|4.1.3.6|1|

3 个答案:

答案 0 :(得分:1)

考虑类似于以下内容:

xmlstarlet sel -t -m '//entry' \
  -v ./company -o '|' \
  -v ./appname -o '|' \
  -v ./appid   -o '|' \
  -v ./content -n     \
  <test.xml

可以编写一个查询,该查询不会依次要求拼写出每个列 - 但写出来是更好的方法,因为它确保每行中的第3列(在这种情况下)总是表示appid,否则不能保证你有空。

请注意,与许多兼容的解析器一样,XMLStarlet需要格式良好的XML文档 - 这意味着正在处理的文档必须具有单个根元素。如果您拥有的是包含文档流的文件(没有包含条目的根元素),则可以伪造;一个丑陋但功能性的方法如下:xmlstarlet ... < <(echo "<root>"; cat test.xml; echo "</root>")

答案 1 :(得分:0)

sed 's/<[^>]*>/|/g;s/||*/|/g' file1 > file2

编辑删除相邻的&#34; ||&#34;对

答案 2 :(得分:0)

awk '$1 {printf s++ ? "|" $0 : $0}' RS='<[^>]+>'
  • 将记录分隔符设置为标记,例如<entry>
  • 只打印&#34; line&#34;有一个字段,AKA不打印标签
  • 如果在第二行&#34;行&#34;或者更多,打印|,否则只需打印&#34;行&#34;

结果

ABC|XYZ|12345678|2014-04-29T20:58:00-07:00|923605123|Crash|Whenever you try to use the graph function.  I expect better from Schwab|4.1.3.6|1