如何删除条目标记并将此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|
答案 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;行&#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