2011-01-11 2 views
0

텍스트가 있고 정규 표현식과 perl을 사용하여 파서를 작성했습니다.일치점을 텍스트의 정확한 지점에서 일치시키는 방법

2 개의 빈 줄 뒤에 텍스트 블록을 인식 할 수있는 패턴이 있기 때문에 2 개의 빈 줄 (정규 표현식 사용)과 필요한 부분을 일치시킬 수 있습니다.

하지만 문제는 전체 텍스트가 소개 부분과 일부 텍스트가 필요하지 않다는 것입니다. 이 두 개의 빈 라인

#!/usr/bin/perl 

use strict; 
use warnings; 

my $file = 'first';      
open(my $fh, '<', $file); 
my $empty = 0;  
my $block_num = 1;  
open(OUT, '>', $block_num . '.txt');  

while (my $line = <$fh>) { 

chomp ($line); 
if ($line =~ /^\s*$/) { 
    $empty++;  
    } elsif ($empty == 2) {  
    close(OUT);  
    open(OUT, '>', ++$block_num . '.txt'); 
    $empty = 0; 
    } 
    else { 
    $empty = 0;} 
print OUT "$line\n"; 

} 
close(OUT); 

이 내가 (정말 작습니다 :))


this is file example

필요로하는 텍스트의 예입니다을 발견하면 여기

텍스트와 일치하는 코드입니다

나는 그것이 단어 LOREM을 발견 할 때까지 텍스트를 반복 할 필요가 있다고 생각한다. 이 텍스트는 "/^LOREM IPSUM /"이라는 정규식을 사용하여 필요한 텍스트가 시작되는 지점이기 때문에 (그리고 단어에 도달하면 텍스트를 한 파일에 저장하기 때문에). 그리고 INDEX 단어가 fount 일 때 텍스트를 반복하거나 텍스트를 별도의 파일에 저장해야합니다.

어떻게 구현할 수 있습니까? 사용해야합니까? 다음 번에 줄을 진행하는 기능이 있습니까?

BR, 율리야

+1

이이 관련 포스트 http://stackoverflow.com/questions/4635833/ – yuliya

+0

내가 파일을 후루룩 소리 내며 먹기와 블록을 일치합니다. 그런 식으로 당신은 다소 못생긴 linecounting 주위에 어지럽히 지 말아야한다 –

+0

어쩌면 당신은 맞다. 그러나 나는 어떤 코드 조각으로 그것을하는 것을 선호 할 것이다. – yuliya

답변

1

당신이 라인을 처리 할 후 LOREM IPSUM로 시작하는 줄을 칠 때까지 헤더 행을 건너 뜁니다

my $in_lorem = 0; 
while (my $line = <$fh>) { 
    if($line =~ /^LOREM IPSUM/) { 
    $in_lorem = 1; 
    next; 
    } 
    next unless $in_lorem; 
    # your processing goes here 
} 

이처럼 뭔가에 while 루프를 변경할 것 .

next을 사용하는 대신 last을 사용하는 대신 더 이상 줄을 처리 할 필요가 없다는 점을 제외하면 특정 줄 일치 이후 모든 줄을 무시하는 데 비슷한 패턴을 사용할 수 있습니다. 그 패턴은 독자에게 운동으로 남아 있습니다. :-)

1

LOREM IPSUM과 일치 할 때 flip flop range operator을 사용하여 처리를 시작하고 INDEX와 일치 할 때 처리를 중지 할 수 있습니다.

#!/usr/bin/perl 
use strict; 
use warnings; 
use 5.010; 

my $file = 'firsttest'; 

open (my $fh, '<', $file) or die "Failed to open $file: $!"; 

while (<$fh>){ 
    if (m/^LOREM IPSUM/ .. m/^INDEX/){ 
     #Do your other matching, processing, etc. here 
     print; 
     last if m/^INDEX/;#Optional, to avoid reading remaining lines. 
    } 
} 
관련 문제