0

我有一个 Test.txt 文件,如下所示:

some data1 func-name1 SECTION.
data to be extracted
data to be extracted
some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

现在,我正在使用触发器运算符来提取范围,其中我的 START= SECTION。和 END= - 退出。出口。如下:

open FILE1, "<Test.txt" 
    or die "Cannot open File1.txt!";

open FINAL, ">Final.txt" 
    or die "Cannot open Finall.txt!";

my $START = 'SECTION.';
my $END   = '-EXIT EXIT.';

while (<FILE1>) {
    if (/$START/ .. /$END|$START/) {

        if ($_ =~ m/$END|$START/) {
            $flag = 1;
        }

        print FINAL $_;

        if ($flag == 1) {          
            print FINAL "\n\n";
            $flag = 0;
        }
    }
}
close FINAL;
close FILE1; 

我想要做的是,我需要两个下一行作为SECTION 之间的分隔符。范围也和我的 Final.txt 应该如下所示:

some data1 func-name1 SECTION.
data to be extracted
data to be extracted


some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

请指导我。

4

1 回答 1

1

你不需要触发器:

#!/usr/bin/env perl
use strict;
use warnings;

my $first = 0;

while (<DATA>) {
    print /SECTION/ && $first++ ? "\n\n$_" : $_;
}

__DATA__
some data1 func-name1 SECTION.
data to be extracted
data to be extracted
some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

我计算节$first以确保在第一节之前没有插入换行符,但如果第一节从第一行开始,您可以只使用特殊变量$.并替换$first++$. > 1.

表达式的第一部分/SECTION/ && $first++对每一行进行评估。/SECTION/是简写,$_ =~ /SECTION/这意味着如果SECTION找不到字符串,则按原样打印该行 ( $_)。

如果SECTION找到$first++被评估。请注意,使用后缀递增是因为我们希望$first对第一部分求值0( false) 以便它按原样 ( $_) 打印,并且两个换行符仅添加到后续部分 ( "\n\n$_") 之前。

于 2012-09-19T05:27:38.467 回答