2013-05-04 2 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> 

나는 type="ps" grep으로하고 </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 특정 .. 찾고 actuallall이 작동합니다. – dreamer

3

줄 바꿈은 XML이 다음과 같은 줄 바꿈으로 포맷 된 경우에만 작동합니다. 실제 XML 파서를 사용해야합니다.

데이터가 너무 크지 않은 경우 (수십 MB) 사용자가 XML::Simple으로 읽고 그 다음 생성 된 데이터 구조를 탐색 할 수 있습니다. 당신은 또한 XML::XPathEngine을 봐야합니다.

0

xml_grepxml_grep2에서 XML을 찾습니다. XML은 라인 중심이 아니기 때문에 일반 텍스트와 완전히 다르므로 grep, sed, awk 또는 ack과 같은 라인 지향 도구가 제대로 작동하는 것이 보장되지 않습니다.

관련 문제