它可以是XML或任何文本格式。一般来说如何在Perl中grep一个文本块?
<track type="ws">
<range>
<rangeStart>0</rangeStart>
<rangeEnd>146.912</rangeEnd>
<locationIndex>0</locationIndex>
<propertyIndex>0</propertyIndex>
</range>
</track>
<track type="ps" id="1">
<range>
<rangeStart>0</rangeStart>
<rangeEnd>146.912</rangeEnd>
<locationIndex>1</locationIndex>
<propertyIndex>1</propertyIndex>
</range>
</track>
我想要type="ps"
grep,直到</range>
。
一种解决方案是打开文件,逐行读取,然后匹配块。
open(FH, "file.txt");
foreach $line (<FH>) {
if ($line =~ m/type="cc"(.*?)<\/range>/) {
print $1;
}
}
但如果没有逐行读取文件,是否有更优化的解决方案?
答案 0 :(得分:5)
Bjørn绝对适合XML。对于更一般的问题,您可能也会对我最喜欢的每个单行中的一个感兴趣:
perl -ne 'print if /type="cc"/../<\/range>/' input.txt
答案 1 :(得分:3)
逐行读取只有在使用这样的换行格式化XML时才会起作用,而这可能不是。您应该使用真正的XML解析器。
如果您的数据不是太大(几(几十)MB),那么您可以使用XML::Simple读取它,然后遍历生成的数据结构。您还应该查看XML::XPathEngine。
答案 2 :(得分:0)