2014-11-06 71 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