免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2375 | 回复: 3
打印 上一主题 下一主题

找出10行以内包含两个指定字符串的段落 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-20 11:20 |只看该作者 |倒序浏览
本帖最后由 paktc 于 2011-01-20 11:27 编辑

在文本中,找出10行以内 里面有
"folder"也有"size"的段落。

比如:
folder size

fsafdsa
f size
ds
fsd folder
f
sa s
fsd
fsd  folder
f
d346s  
f346
3521
f35
2365
4523161
dfs2355
6436
3147
2666666size 这个超出10行


1 : folder size <- 这一行有folder 和size
=======
1 : folder size <-
2 :
3 : fsafdsa
4 : f size         <- 这一段有folder 和size
=======
1 : folder size <-
2 :
3 : fsafdsa
4 : f size
5 : ds
6 : fsd folder <- 这一段有size 和folder
=======
4 : f size       <-
5 : ds
6 : fsd folder <- 这一段有size 和folder
=======

我只是……  偶然在搜索的时候想要用到这样的方式。
好像蛮有思考空间的。  如果说同时出现在同一行的话大概就是以上的情况
  貌似可以先筛选出所有包含字串A 和字串B的行号然后对比出来额,编写中

论坛徽章:
0
2 [报告]
发表于 2011-01-20 12:50 |只看该作者
  1. use strict;

  2. my $str=join '^&*',<DATA>;
  3. $str=~s/(\r|\n)//g;
  4. my $i;
  5. $str=~m{(folder.*?size)(?{evalsub($1)})(?!)};
  6. $str=~m{(size.*?folder)(?{evalsub($1)})(?!)};

  7. sub evalsub(){
  8.         my $tmp=shift;
  9.         my @tmp=split /\^\&\*/,$tmp;
  10.         if($#tmp<9){
  11.                 print "第".$i++."个:\n";
  12.                 my $j=0;
  13.                 foreach(@tmp){
  14.                         print "row".$j++."\t: $_\n";
  15.                         }
  16.         }               
  17. }

  18. __DATA__
  19. folder size

  20. fsafdsa
  21. f size
  22. ds
  23. fsd folder
  24. f
  25. sa s
  26. fsd
  27. fsd  folder
  28. f
  29. d346s  
  30. f346
  31. 3521
  32. f35
  33. 2365
  34. 4523161
  35. dfs2355
  36. 6436
  37. 3147
  38. 2666666size
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-01-20 12:53 |只看该作者
[quote]perl k.t
第0个:
row0    :folder size
第1个:
row0    :folder size
row1    :
row2    :fsafdsa
row3    :f size
第2个:
row0    :size
row1    :
row2    :fsafdsa
row3    :f size
row4    :ds
row5    :fsd folder
第3个:
row0    :size
row1    :ds
row2    :fsd folder
第4个:
row0    :size
row1    :ds
row2    :fsd folder
row3    :f
row4    :sa s
row5    :fsd
row6    :fsd  folder
[/quote]

论坛徽章:
0
4 [报告]
发表于 2011-01-20 15:55 |只看该作者
本帖最后由 paktc 于 2011-01-20 16:20 编辑

谢谢楼上大侠提供的思路,慢慢消化


靠包含字符串的行号来判断的思路。弄到现在=_=

  1. open READ,"<test.txt" or die "$!";
  2. @all=<READ>;
  3. close READ;
  4. ($line,$a,$b)=(0,0,0);
  5. foreach (@all) {
  6.         if (/folder/) {$a[$a++]=$line};
  7.         if (/size/) {$b[$b++]=$line};
  8.         $line++;
  9. }

  10. foreach $a (@a) {
  11.         foreach $b (@b) {
  12.                 ($ta,$tb)=($a,$b);
  13.                 if ($tb<$ta) {($ta,$tb)=($b,$a)};
  14.                 if (($tb-$ta)<10) {
  15.                         foreach $line ($ta..$tb) {
  16.                                 print "$line : $all[$line]";
  17.                         }
  18.                         print "\n";
  19.                 }
  20.         }
  21. }

  22. <STDIN>;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP