2013-07-10 57 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。而且你不應該使用正則表達式來處理XML:如果你使用專門用於該任務的庫,它會更簡單和更安全。如果你發佈更多*實際*數據,並在上下文中顯示,那麼你將得到更好的答案。 – Borodin

回答

1

不明白爲什麼要那樣做的第一場比賽與\n,但對你的任務,你可以做這樣的:

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

我仍然在學習perl,所以我可能是錯的,但是與\ n的第一次比賽嘗試去除任何懸掛的新線條的文件。 我嘗試用上面提供的行(($ text)=〜/ \「([^:] *)替換行$ text =〜m/\」(。*):> /;;; 但是,當腳本到達打印$文本行時,輸出到終端仍然是文件原樣,而不是我正在提取的文本片段。 對不起,如果我是拙劣的東西!!我應該將結果放到一個單獨的變量中? – Taliesin

+0

鼓勵使用正則表達式來處理XML是一個壞主意,它充滿了問題,Perl有幾個好的XML庫 – Borodin

+0

@ user1849737:Rohit給你的答案並不是' t改變'$ 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"; 
相關問題