2013-08-29 23 views
0

我有一個XML文件,我希望提取所有出現的一些標記AB。該文件是一個長約500000字符的長隊。sed正則表達式匹配很長的行

現在我知道正則表達式等等,但是當我用sed嘗試它時,嘗試僅提取標籤內的字符,我完全失去了結果:)。

這裏是我的命令:

sed -r 's/(.*)<my_tag>([A-Z][A-Z])<\/my_tag>(.*)/hello\2/g' myfile.out

轉換整個文件只有 「helloAB」 例如預計至少應該包含100多場比賽。

因此,我正在考慮貪婪匹配的概念,但沒有到任何地方。也許awk是一個更好的主意?

+0

'。*'位已經吃光了一切。它可能會解決這個問題,使用兩個實例的非貪婪版本。 – abiessu

+0

這是grep的工作,而不是sed。 –

+2

您最好使用適當的XML解析實用程序,因爲XML不是常規語言,所以正則表達式不是該工作的最佳工具。你可以用正則表達式來實現一些簡單的XML解析,但是,正如你已經看到的那樣,你甚至可以在這裏使用RE,這可能會有點棘手。 – twalberg

回答

1

如果你有蟒蛇(2.6+),這應該是相當微不足道:

import xml.dom.minidom as MD 
tree = MD.parse("yourfile.xml") 
for e in tree.getElementsByTagName("AB"): 
    print e.toprettyxml() 

一般情況下,試圖通過解析XML手應該避免,因爲有這樣的更加簡單的解決方案。更不用說,這些類型的庫可以讓您輕鬆訪問屬性和值,而無需進一步解析。

0

感謝您的回答。

我試了@ MannyD的建議,不幸的是XML似乎沒有很好地形成,因此解析失敗。由於我無法預見只有格式良好的XML,我才制定了grep解決方案,這是做這項工作的。

grep -o "<my_tag>[A-Z][A-Z]</my_tag>" myfile.out | sort -u

-o選項標誌將打印每場比賽在新的一行,從那裏我只是排序,並從文件打印出唯一的匹配。