【问题标题】:Perl - how to grep a block of text from a filePerl - 如何从文件中grep文本块
【发布时间】:2015-07-10 14:26:14
【问题描述】:

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

我想用 grep 搜索 type="ps" 并获取所有内容,直到 &lt;/range&gt;

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

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

但是不逐行读取文件有没有更优化的解决方案?

【问题讨论】:

    标签: perl grep


    【解决方案1】:

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

    perl -ne 'print if /type="cc"/../<\/range>/' input.txt
    

    【讨论】:

    • 太棒了!谢谢..我实际上是在寻找一种更通用的方法,而不是特定于 xml 的方法..这行得通。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-25
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 2021-06-20
        • 2012-07-14
        相关资源
        最近更新 更多