找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24399|回复: 5

[问题求助] Perl怎样获取指定字符串所在行的上N行和下M行?

[复制链接]
发表于 2011-6-6 12:22:15 | 显示全部楼层 |阅读模式
a.txt内容如下:
111perl
222perl
333perl
444perl
555perl
666perl

假设N=2,M=1,想获取字符串“444perl”所在行的上两行到下一行之间的内容:
222perl
333perl
444perl
555perl
发表于 2011-6-6 21:57:07 | 显示全部楼层
  1. #usr/bin/perl
  2. open (FH,"<a.txt") || die "Can't find it\n";
  3. while (<FH>) {
  4. $a=$. if /444perl/;
  5. }
  6. close FH;
  7. open (FH,"<a.txt") || die "Can't find it\n";
  8. $b=$a-2;
  9. $c=$a+1;
  10. if ($b..$c) {print};
  11. close FH;
复制代码
求高人简化一下。用seek出现问题了:行号变了
发表于 2011-6-6 22:22:44 | 显示全部楼层
我觉得一般可能要考虑一段落中如果出现 多个 444perl的情况……
罢了,先大致做一下,有细节再说。学习学习

  1. open READ,"<src.txt";
  2. @all=<READ>;
  3. $n=2;
  4. $m=1;
  5. $line=0;
  6. foreach (@all) {
  7.         chomp;
  8.         $line+=1;
  9.         if (/^444perl$/) {
  10.                 for $tmp (($line-$n) .. ($line+$m)) {
  11.                         print "Line$tmp : $all[$tmp-1]\n";
  12.                 }
  13.         }
  14. }
  15. <STDIN>;
复制代码
以上代码只是对存在444perl行的前两到后一行进行枚举,并没有判断范围是否超标。
发表于 2011-6-6 22:25:40 | 显示全部楼层
2# sxw


你是不是下面这个想法?
  1. open (IN,"a.txt");
  2. while (<IN>) {
  3.     $a = $. if /444perl/;
  4. }
  5. close IN;
  6. my $b = $a - 2;
  7. my $c = $a + 1;
  8. open (IN,"a.txt");
  9. while (<IN>) {
  10.     print if $. >= $b && $. <= $c;
  11. }
  12. close IN;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:47 , Processed in 0.016282 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表