2013-09-25 2 views
0

Я хочу, чтобы соответствовать определенной строке в файле, после сопоставления конкретной строки я хочу пропустить 5 строк и напечатать следующий. Например.Пропуск определенного количества строк после сопоставления слова PERL

Lecture  <==(I want to match lecture) 
1 
2 
3 
4 
5 
Hello <==(And then i want to print this line) 

Я попытался сделать это, но это не будет работать:

if ($line =~ m/(Lecture)/) { 
    $1 = $currentLine; 
    if ($currentLine == $1+6) { 
     print $currentLine; 
    } 
} 

Что я делаю неправильно?

+0

Используйте переменное имя, отличное от '$ 1', его значение будет заменено на' Lecture' на каждой итерации (из-за (ненужной) группы захвата в регулярном выражении). Кроме того, внутреннее 'if' должно быть вне внешнего. – RobEarl

ответ

2

Вы можете использовать переменную $., чтобы отслеживать номер строки, в которой произошло совпадение, и пропускать нужное количество строк. Высказывание:

perl -ne '/^Lecture/ && do {$l=$.} ; $.==$l+6 && print' inputfile 

напечатает 6-й линии после матча (в этом случае производят Hello).

+0

'perl -ne '$ l = $. если/^ Лекция /; print if $. == $ l + 6 'file' –

+0

if ($ line = ~ m/(Lecture) /) {\t \t \t \t $ 1 = $ currentLine; \t \t if ($ currentLine == $ 1 + 6) { \t \t \t print $ currentLine; \t \t} \t \t \t } я попытался сделать это, но это не будет работать. Существуют ли какие-либо проблемы? –

0
#/usr/bin/perl 
use strict; 
use warnings; 

open my $fh, '<', 'data.txt' or die "can't open data.txt: $!"; 

while (my $line = <$fh>) { 
    if ($line =~ /Lecture/) { #if a match is found ... 
     <$fh> foreach 1 .. 5; # throw away next five lines from iterator 
     my $next_line = <$fh>; # assign next one 
     print $next_line;  # and print it 
    } 
} 
Смежные вопросы