首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Perl中获取匹配行后面的多行?

如何在Perl中获取匹配行后面的多行?
EN

Stack Overflow用户
提问于 2009-06-24 20:04:55
回答 9查看 30.6K关注 0票数 11

我在Perl中逐行解析一个大文件(以\n结尾),但是当我到达某个关键字时,比如" TARGET ",我需要抓取TARGET和下一个完全空的行之间的所有行。

因此,给定文件的一段:

第1行

第2行

第3行

第4行目标

第5行抓取这行

第6行抓取这行

\n

它应该变成:

第4行目标

第5行抓取这行

第6行抓取这行

我遇到麻烦的原因是我已经逐行检查了文件;如何在解析过程中途更改我所分隔的内容?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-06-24 20:11:12

你想要这样的东西:

代码语言:javascript
复制
my @grabbed;
while (<FILE>) {
    if (/TARGET/) {
        push @grabbed, $_;
        while (<FILE>) {
            last if /^$/;
            push @grabbed, $_;
        }
    }
}
票数 23
EN

Stack Overflow用户

发布于 2009-06-24 20:39:34

range operator是这类任务的理想选择:

代码语言:javascript
复制
$ cat try
#! /usr/bin/perl

while (<DATA>) {
  print if /\btarget\b/i .. /^\s*$/
}

__DATA__
Line 1
Line 2
Line 3
Line 4 Target
Line 5 Grab this line
Line 6 Grab this line

Nope
Line 7 Target
Linu 8 Yep

Nope again

$ ./try
Line 4 Target
Line 5 Grab this line
Line 6 Grab this line

Line 7 Target
Linu 8 Yep
票数 14
EN

Stack Overflow用户

发布于 2009-06-24 20:17:05

简短的答案是: perl中的行分隔符是$/,所以当您命中目标时,可以将$/设置为"\n\n",读取下一个“行”,然后将其设置回"\n"...就是这样!

现在来看更长的一个:如果使用English模块(它为Perl的所有神奇变量提供了合理的名称,那么$/就称为$RS$INPUT_RECORD_SEPARATOR )。如果您使用IO::Handle,那么IO::Handle->input_record_separator( "\n\n")将会工作。

如果您要在更大的代码中执行此操作,请不要忘记进行本地化(在适当的作用域中使用local $/; ),或者将$/设置回其原始值"\n"

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1040657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档