我建議對處理XML內容使用線定向工具,如grep
/sed
/awk
等XML是不一個面向行的格式;因此,在文本表達時,xml元素跨行的特定分佈是偶然的。 (你可以有你的例子寫在一個單行和它仍然將是同樣正確的XML格式。)
我解析以及形成在shell腳本 XML內容是xmlstarlet
工具的建議。這是一種以腳本方式處理xml的瑞士軍刀。
首先,確保你的xml內容是well formed。以下是包含您例的數據形成的阱的xml:(該「井構性」一個XML文件的可與xmlstarlet val
進行檢查)
<?xml version="1.0" encoding="UTF-8"?>
<tasks>
<task id="0">some stuff</task>
<task id="1">some other stuff</task>
<task id="2">yet another stuff</task>
</tasks>
爲了從XML,使用提取內容xmlstarlet sel
。該工具需要使用XPath表達式來過濾必須選擇的內容。 (在很多方面,xmlstarlet sel
和XPath是XML什麼grep
和正則表達式爲面向行的內容。)使用保存在文件tasks.xml
上面的XML樣本
例子:所有任務
提取物含量
$ xmlstarlet sel -T -t -m '/tasks/task' -v '.' -n tasks.xml
some stuff
some other stuff
yet another stuff
獲取所有任務ID
$ xmlstarlet sel -T -t -m '/tasks/task' -v '@id' -n tasks.xml
0
1
2
任務
提取內容的id爲大於或等於1
$ xmlstarlet sel -T -t -m '/tasks/task[@id>="1"]' -v '.' -n tasks.xml
some other stuff
yet another stuff
天真轉換爲CVS格式
所有任務0
$ xmlstarlet sel -T -t -m '/tasks/task[@id="0"]' -v '.' -n tasks.xml
some stuff
提取物含量
$ xmlstarlet sel -T -t -m '/tasks/task' -v '@id' -o ',' -v '.' -n tasks.xml 0,some stuff 1,some other stuff 2,yet another stuff
是這樣的文件還是有更多的XML?如果就這樣,你可以做'awk'/^/{flag = 0} flag'' –
dawg
@dawg你應該寫這個答案 - 它比我想出的要簡潔得多。 –
@JerryJeremiah:你可以將它添加到你的,我將它投票;-) – dawg