2011-03-01 71 views
0

我有以下文件:如何在自己的分隔符上分割文件?

some data 
some data 1 
some data 1 
hostname = abc 
some data 
some data 1 
some data 1 
some data 
some data 1 
some data 1 
hostname = xyz 
some data 
some data 1 
some data 1 
some data 
some data 1 
some data 1 
hostname = pqr 
some data 
some data 1 
some data 1 
some data 
some data 1 
some data 1 

我如何可以提取使用Perl 2名的主机名行条目之间的界限?

+0

我想这是一个罕见的情况之一时,你真的希望$ /可以设置为一个正则表达式:-) – 2011-03-02 09:12:16

回答

0

啜食整个事情到一个字符串,$string,做这样的事情:

$string =~ /hostname = abc\n(.*)hostname = xyz\n/s; 

abcxyz主机线之间的线路将在之后$1

0
perl -nle'/hostname = abc/../hostname = xyz/&&print' datafile 
+0

这只会打印主机名的条目。 – Avinash 2011-03-01 19:13:54

+0

触发器操作符的优先级低于&&。你可能想用'和'代替。 – 2011-03-01 19:26:17

+0

@Avinash:尝试我的建议。如果我是对的,那么'&& print'就会被放在右边的检查上。 – 2011-03-01 19:27:15

0

split确实够用,只是给它正确的模式。

use DDS; Dump split /hostname = .*\n/, 'some data 
some data 1 
some data 1 
hostname = abc 
some data 
some data 1 
some data 1 
some data 
some data 1 
some data 1 
hostname = xyz 
some data 
some data 1 
some data 1 
some data 
some data 1 
some data 1 
hostname = pqr 
some data 
some data 1 
some data 1 
some data 
some data 1 
some data 1'; 

输出

$VAR1 = "some data\nsome data 1\nsome data 1\n"; 
$VAR2 = "some data\nsome data 1\nsome data 1\nsome data\nsome data 1\nsome data 1\n"; 
$VAR3 = "some data\nsome data 1\nsome data 1\nsome data\nsome data 1\nsome data 1\n"; 
$VAR4 = "some data\nsome data 1\nsome data 1\nsome data\nsome data 1\nsome data 1"; 
1

如何:

#!perl -w 
my @someArray; 

while (<DATA>) { 
    if (/hostname.*/) { 
     print @someArray; 
     @someArray =(); 
    } 
    else { 
     push (@someArray, $_); 
    } 
} 

__DATA__ 
some data 
some data 1 
some data 1 
hostname = abc 
some data 
some data 1 
some data 1 
some data 
some data 1 
some data 1 
hostname = xyz 
some data 
some data 1 
some data 1