2013-07-10 5 views
0

큰 파일이 있습니다. 텍스트를 선택하고 파싱하고 싶습니다.Perl의 두 문자 사이에서 XML의 텍스트를 가져 오는 방법

en-US AcceptedText pt="dial:def"Tag u="contact"Mom/Tag/AcceptedText 11373 

내가 잡고 싶은 텍스트의 조각이 첫 번째 ": 사이에 다음은 파일에서 실제 샘플입니다. 위의 경우 단어는 dial이됩니다.

#!/usr/bin/perl 

open (SESAME, '/home/my_name/whereMyFileLives.txt'); 
while (<SESAME>) { 
    $text .= $_; 
} 
close (SESAME); 

$text =~ /\n*$/; 
$text =~ m/ \" (.*) :> /; 

print $text; 

나는이 스크립트를 실행하면 파일이 이미 정확하게 터미널에 파일을 인쇄 : 여기

내가 조립 한 스크립트입니다. 그것은 텍스트를 구문 분석하지 않으며 내가 추출하고 싶습니다 텍스트의 발췌 문장을 추출하지 않습니다 ..

모든 포인터?

+1

를 귀하의 의견 때문에 유효한 XML이 아니기 때문에 표시하는 샘플처럼 보이지 않는 XML 데이터입니다. 그리고 regexes를 사용하여 XML을 처리하면 안됩니다 : 작업에 사용 된 라이브러리를 사용하면 훨씬 쉽고 안전합니다. 실제 * 데이터를 더 많이 게시하고 상황에 맞게 표시하면 더 나은 답변을 얻을 수 있습니다. – Borodin

답변

1

은 왜 \n와 첫 경기를하고있는 이해할 수없는,하지만 작업이처럼 작업을 수행 할 수 있습니다

my ($result) = $text =~ /\"([^:]*):/; 
+0

나는 아직도 perl을 배우고 있기 때문에 나는 틀릴 것이다. \ n \ n \ n \ n \ n 매달린 느슨한 줄 바꾸기 파일을 시도하고 제거하는 첫 번째 일치를했다. 위에서 제공 한 줄 ($ text) = ~/\ "([^ :] *) : /; 줄에 $ text = ~ m/\"(. *) :> 그러나 스크립트가 print $ text 행에 도달하면 추출 할 텍스트의 조각이 아니라 여전히 파일의 출력이 터미널로 출력됩니다 .. 내가 방주를하면 죄송합니다 !! 그 결과를 별도의 변수에 넣어야합니까? – Taliesin

+0

regexes를 사용하여 XML을 처리하도록 권장하는 것은 좋지 않습니다. 문제가 많으며 Perl에는 여러 가지 XML 라이브러리가 있습니다. – Borodin

+0

@ user1849737 : Rohit이 준 답변은 ' '$ text'를 변경하면 원하는 문자열의 섹션을 추출하여'$ result'에 넣습니다. – Borodin

1
my ($string) = $text =~ /"(.*?):/; 
+0

감사합니다! – Taliesin

-1

시도 :

#!/usr/bin/env perl 

use strict; 
use warnings; 

# -------------------------------------- 

use charnames qw(:full :short); 
use English qw(-no_match_vars) ; # Avoids regex performance penalty 

# open (SESAME, '/home/my_name/whereMyFileLives.txt'); 
# 
# Please use the three-argument open 
my $sesame_file = '/home/my_name/whereMyFileLives.txt'; 
open my $sesame_fh, '<', $sesame_file or die "could not open $sesame_file: $OS_ERROR\n"; 

# while(<SESAME>) 
while(my $line = <$sesame_fh>){ 

# { 
# $text .= $_; 
# } 
# close (SESAME); 
# $text=~/\n*$/; 
# $text=~m/ \" (.*) :> /; 
# print $text; 
# 
# No need to store the complete text, just extract what you want from each line 
    if($line =~ m{ \" ([^:]*) \: }msx){ 
     my $snippet = $1; 
     print "$snippet\n"; 
    } # end if 

} # end while 
close $sesame_fh or die "could not close $sesame_file: $OS_ERROR\n"; 
관련 문제