sed正则表达式匹配排长队

时间:2013-08-29 15:57:32

标签: regex bash sed

我有一个XML文件,我希望提取所有出现的某些标签AB。该文件是一个长行,约500 000个字符。

现在我知道regexp等等,但是当我用sed尝试并尝试仅提取标签中的字符时,我对结果完全丢失了:)。

这是我的命令:

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

仅使用“helloAB”转换整个文件,例如虽然预期至少应包含100多场比赛。

因此,我正在考虑贪婪匹配的概念,但这并不是随处可见。也许awk是个更好的主意?

2 个答案:

答案 0 :(得分:1)

如果你有python(2.6+),这应该是相当简单的:

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

一般来说,应该避免尝试手工解析XML,因为有更简单的解决方案。更不用说,这些类型的库可以让您轻松访问属性和值,而无需进一步解析。

答案 1 :(得分:0)

感谢您的回答。

我尝试了@MannyD的建议,遗憾的是XML似乎没有很好地形成,因此解析失败了。因为我无法预料到只有格式良好的XML,所以我提出了grep解决方案,这就完成了工作。

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

-o选项标记将在新行上打印每个匹配项,从那里我只是排序并打印文件中的唯一匹配项。