regex - 如何在 Perl 中的正则表达式匹配后打印行?

我正在解析一个格式如下的文本文件

> alpha
apple
airplane
art
> beta
bear
blue
beat
> charlie
cow
cent
coat

我正在尝试查找具有主题(例如“ta”)的条目 (alpha beta charlie)。如果找到主题,那么我将尝试打印出每个条目下方的单词(bear blue beat)。 所以在这个例子中,我想要以下输出

> beta
bear
blue
beat

我已经知道如何打印输入行,但不知道如何打印下面的行。任何想法将不胜感激。

my $motif = "ta";
my $file = "file.pl";
open(INPUT, $file) or die "Can't open file.\n";
parse($motif);

sub parse{
    my ($x) = (@_);
    while(<INPUT>){
        if($_ =~ />*($x)/){
            print $_."\n";
#       if($_ !~ />/){
#           print $_."\n";
        }else{
            next;
        }
    }
}

最佳答案

这是另一种选择:

use strict;
use warnings;

my $motif = pop;
local $/ = '>';    # record separator

while (<>) {
    chomp;
    print $/ . $_ if /(?<=\x20).*?$motif/;
}

用法:perl script.pl data.txt 'ta'

在 data.txt 中输出数据:

> beta
bear
blue
beat

符号local $/ = '>'将记录分隔符设置为 >而不是通常的 \n , 所以每个 >标记已读取记录的开始。您搜索的行在 > 之后有一个空格,这就是正面回顾 (?<=\x20)尝试匹配。

您可以通过执行以下操作将输出重定向到文件:perl script.pl data.txt 'ta' >output.txt .

https://stackoverflow.com/questions/14846045/

相关文章:

CSS - 向内联文本的第二行添加填充

svg - 如何在 HTML 中呈现不同大小的 SVG?

bash - 如何从 Bash 中的域获取主 MX IP

php - 通知 : unserialize() for symfony2 ( connection

jquery - 谷歌地图,基于 Zoom 的比例圆

google-apps-script - 在电子表格的 App 脚本中选择连续范围

sql - Oracle 在 DBA_ROLES 上的选择权限

sql - 如何将日期时间字段添加到 + 1 天

memory - 了解mmap

sql - "column ambiguously defined"