如何匹配两个空行之间的行?(结帖)

如何匹配两个空行之间的行?(结帖)

这个用perl如何实现呢?



QUOTE:
原帖由 linuxnextyear 于 2008-2-26 11:28 发表
这个用perl如何实现呢?

try the following code

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
my $text = shift;
open my $file,"<","$text" or die "Fail to open $text $!";
while(<$file>){
print if (/^\s*$/.../^\s*$/);
}

运行结果

QUOTE:
<lig@other-server:~/chinaunix>$ cat data
ajflasjfl

fljslfjslfjls
jslfjdkeurie
souosuofusof

sjfsjf
fsjlfsjlfsjlf
sfjsfjl



QUOTE:
<lig@other-server:~/chinaunix>$ ./lines data

fljslfjslfjls
jslfjdkeurie
souosuofusof

或者你直接mark一下
第一次碰到空行的时候设置一个flag
第二次碰到了就unset flag
多谢楼上的,这个方法我试过,这个连空行也给打印出来了!

如何不把空行打印出来呢?


QUOTE:
原帖由 linuxnextyear 于 2008-2-26 13:23 发表
多谢楼上的,这个方法我试过,这个连空行也给打印出来了!

如何不把空行打印出来呢?

简单

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
my $text = shift;
open my $file,"<","$text" or die "Fail to open $text $!";
my @candidate;
while(<$file>){
push @candidate ,$_ if (/^\s*$/.../^\s*$/);
}
pop @candidate;
shift @candidate;
print @candidate;



QUOTE:
<lig@other-server:~/chinaunix>$ cat data
ajflasjfl

fljslfjslfjls
   jslfjdkeurie
souosuofusof

sjfsjf
fsjlfsjlfsjlf
sfjsfjl
<lig@other-server:~/chinaunix>$ ./lines data
fljslfjslfjls
   jslfjdkeurie
souosuofusof

注意@candidate打印是不能加""



QUOTE:
my $text = shift;

这行是什么意思啊?


QUOTE:
原帖由 mouse.rice 于 2008-2-26 14:26 发表

这行是什么意思啊?

在这里shift默认操作对象是@ARGV
也就是
my $text = shift @ARGV;


QUOTE:
原帖由 linuxnextyear 于 2008-2-26 13:23 发表
多谢楼上的,这个方法我试过,这个连空行也给打印出来了!

如何不把空行打印出来呢?

或者

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
my $text = shift;
open my $file,"<","$text" or die "Fail to open $text $!";
while(<$file>){
print if (/^\s*$/.../^\s*$/ and not /^\s*$/);
}

就是加一个判断是否是空行的regex

空行我理解为\s*
如果是纯粹意义上的空行
将上面的/^\s*$/用/^$/代替


QUOTE:
原帖由 churchmice 于 2008-2-26 14:31 发表

在这里shift默认操作对象是@ARGV
也就是
my $text = shift @ARGV;

请教,在这里,这个@ARGV代表什么参数?关于@ARGV一直没有理解透彻。总感觉Perl语法很微妙!多谢了!


QUOTE:
原帖由 mouse.rice 于 2008-2-26 14:52 发表

请教,在这里,这个@ARGV代表什么参数?关于@ARGV一直没有理解透彻。总感觉Perl语法很微妙!多谢了!

@ARGV是命令行参数列表:

[Copy to clipboard] [ - ]
CODE:
[root@localhost perl]# more gmm.pl
#!/usr/bin/perl

print "@ARGV";
[root@localhost perl]# perl gmm.pl 1 2 3
1 2 3[root@localhost perl]#

还有能不能帮忙解释一下这段的意思:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
open(FILE,"mail.txt") || die "error: $!";
$_ = join '',<FILE>;
#print $_;
print $1 while /^\s*\n(^.+\n)(?=^\s*\n)/gm;