2013-05-04 54 views
1

它可以是XML或任何文本格式。一般來說,如何在Perl中對一段文本進行grep?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"和得到的一切,直到</range>

一個解決方案是打開文件,逐行閱讀,然後匹配塊。

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

但有沒有更好的解決方案,而不需要逐行讀取文件?

回答

5

Bjørn絕對適合XML。爲了您更普遍的問題,你可能也有興趣在我最喜歡每一個俏皮話之一:

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

太棒了!謝謝..我真的在尋找一個更一般的方法,而不是一個特定的XML ..這工作。 – dreamer 2013-05-06 12:44:45

3

只有XML格式化爲像這樣的換行符時,纔可以逐行讀取,而這很可能不是。你應該使用真正的XML解析器。

如果您的數據不是太大(幾MB(幾十MB)),那麼您可以使用XML::Simple來讀取它,然後遍歷生成的數據結構。你也應該看看XML::XPathEngine

0

對於XML看看xml_grepxml_grep2。 XML與純文本完全不同,它不是面向行的,所以面向行的工具(如grep,sed,awk或ack)無法保證正常工作。