我有一个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 "nn";
$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.
请指导我。
你不需要触发器:
#!/usr/bin/env perl
use strict;
use warnings;
my $first = 0;
while (<DATA>) {
print /SECTION/ && $first++ ? "nn$_" : $_;
}
__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
),以便按原样打印($_
),并且仅在以下部分("nn$_"
)前面附加两个换行符。