2014-11-06 67 views
-4

文件1提取特定格式的文本-perl

--- abcd10 --- 

--- abcd31 --- 

--- abcd32 --- 
MY Addr   info name policy 
--------------------------------------------------------- 
00:0a:91:00:65:93 HQLT DKAHN Default 


--- abcd33 --- 
No info found 

--- abcd34 --- 
No info found 

--- abcd35 --- 

MY Addr   info name policy 
--------------------------------------------------------- 
00-0a-91-00:15:03 HQ-LT-DKAHN Default 
00-0a-91-10:15:03 HQ-LT-DKAHN Default 

在上面的文件我想只提取特定的格式。

--- abcd32 --- 
MY Addr   info name policy 
--------------------------------------------------------- 
00:0a:91:00:65:93 HQLT DKAHN Default 

而且

--- abcd35 --- 
MY Addr   info name policy 
--------------------------------------------------------- 
00-0a-91-00:15:03 HQ-LT-DKAHN Default 
00-0a-91-10:15:03 HQ-LT-DKAHN Default 

代碼:

#!/usr/bin/perl 
use warnings; 
use strict; 
my $file; 
my $start_marker_mqstats = qr{^\-+\s*\w+\s*\-+.* $}x; 
my $end_marker_mqstats = qr{^\s* $}x; 
open($file,"<", "file") || die $!; 
while(<$file>) {  
    if ($_ =~/^\-\-\-\s\w+\s\-\-\-/){ 
     if ($_ =~/^MY\sAddr.*/){  
      next unless my $range = /$start_marker_mqstats/ .. /$end_marker_mqstats/; 
      my $line = $_; 
      print $line if $range !~ /^1$|E/;  
     }  
    } 
} 
+0

#!/ usr/bin/perl 使用警告; 使用嚴格; my $ file; my $ start_marker_mqstats = qr {^ \ - + \ s * \ w + \ s * \ - +。* $} x; my $ end_marker_mqstats = qr {^ \ s * $} x; open($ file,「<」,「file」)||死! ($ _ =〜/^\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \){ while(<$file>){if _ /){ next除非我的$ range =/$ start_marker_mqstats/../$ end_marker_mqstats /; my $ line = $ _; print $ line if $ range!〜/^1 $ | E /; } } } – 2014-11-06 09:58:44

+0

我上面的代碼不起作用 – 2014-11-06 09:59:25

+0

我想打印/提取如下。 --- abcd32 --- MY地址信息名稱政策 --------------------------------- -------------- 00:0a:91:00:65:93 HQLT DKAHN默認 - abcd35 --- MY地址信息名稱政策 ------ -------------------------------------------------- -------------------- 00-0a-91-00:15:03 HQ-LT-DKAHN默認00-0a-91-10:15:03 HQ -LT-DKAHN默認 – 2014-11-06 10:31:06

回答

1

您可以使用段落模式(設置$/ = "")和 「grep的」 爲開頭MY線,使用/m正則表達式修改使換行匹配^

perl -00 -nlwe"print if /^MY /m" input.txt 

-00設置輸入記錄分隔符$/""

或程序文件:

$/ = ""; 

while (<>) { 
    print if /^MY /m; 
} 

在這兩種情況下,輸出是:

--- abcd32 --- 
MY Addr   info name policy 
--------------------------------------------------------- 
00:0a:91:00:65:93 HQLT DKAHN Default 

MY Addr   info name policy 
--------------------------------------------------------- 
00-0a-91-00:15:03 HQ-LT-DKAHN Default 
00-0a-91-10:15:03 HQ-LT-DKAHN Default 

在第二種情況下缺少的標題,是因爲你在你的樣品輸入了一個空行有。我猜這是你的一個複製/粘貼錯誤,而不是你的輸入。

+0

謝謝TLP。我可以這樣做嗎?一行包含或具有--- abcdxx ---並且下一行以MY開頭,那麼它應該從--- abcdxx ---打印到下一個空行或單詞匹配。 --- abcdxx --- MY地址信息名稱政策 ----------------------------------- ---------------------- 00:0a:91:00:65:93 HQLT DKAHN默認 --- abcdxx --- 我的地址信息名稱政策 ----------------------------------------------- ---------- 00-0a-91-00:15:03 HQ-LT-DKAHN默認 00-0a-91-10:15:03 HQ-LT-DKAHN默認 – 2014-11-06 11:20:09

+1

不太確定我明白你的意思。我回答之後,你又問我同樣的問題嗎? – TLP 2014-11-06 11:29:50