1

它可以是 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>

我想 greptype="ps"并得到一切,直到</range>.

一种解决方案是打开文件,逐行读取,然后匹配块。

open(FH, "file.txt");
foreach $line (<FH>) {
    if ($line =~ m/type="cc"(.*?)<\/range>/) {
        print $1;
    }
}

但是如果不逐行读取文件,是否有更优化的解决方案?

4

3 回答 3

5

Bjørn 绝对适合 XML。对于您更一般的问题,您可能还对我最喜欢的每个单行词之一感兴趣:

perl -ne 'print if /type="cc"/../<\/range>/' input.txt
于 2013-05-04T07:05:55.567 回答
3

仅当 XML 使用像这样的换行符格式化时,逐行读取才会起作用,而这很可能不是。您应该使用真正的 XML 解析器。

如果您的数据不是太大(几(几十)MB),那么您可以使用XML::Simple读取它,然后遍历生成的数据结构。您还应该看看XML::XPathEngine

于 2013-05-04T06:42:55.457 回答
0

对于 XML,请查看xml_grepxml_grep2。XML 与纯文本的不同之处在于它不是面向行的,因此不能保证像 grep、sed、awk 或ack这样的面向行的工具能够正常工作。

于 2013-05-04T09:34:08.433 回答