Perl: печатать все строки после матча - PullRequest
4 голосов
/ 09 апреля 2019

Я пытаюсь проанализировать файл в Perl. Я хочу напечатать все строки после соответствия регулярному выражению

Например, файл

num_of_dogs,10,#start_reading
num_of_cat,15
num_birds,20
num_of_butterfly,80
.....

Я хочу все строки после матча #start_reading

Я пробовал это, но он просто печатает следующую строку

while (my $line = <$csv_file>) {
    next unless $line =~ /(.*),#end_of_tc/;
    if ($line =~ /(.*)/){
    print $file = $1;
    }
}

Вывод будет выглядеть так

num_of_cats,15
num_of_birds,20
......

Заранее спасибо

Ответы [ 4 ]

7 голосов
/ 09 апреля 2019

Вы также можете использовать триггер (..), чтобы пропустить все строки от начала файла до строки, содержащей #start_reading

while (<$fh>) {
    next if 1 .. /#start_reading/;
    print;
}

.строка 1 файла соответствует строке #start_reading.Затем он печатает оставшиеся строки в файле.

7 голосов
/ 09 апреля 2019

Вы можете установить флаг, если строка содержит #start_reading, и печатать строку, только если флаг истинен:

while (my $line = <$csv_file>) {
    print $line if $start;
    $start ||= $line =~ /#start_reading/;
}

И если вы хотите прекратить чтение после встречи с #stop_reading:

while (my $line = <$csv_file>) {
    print $line if $print;
    $print ||= $line =~ /#start_reading/;
    $print &&= $line !~ /#stop_reading/;
}
3 голосов
/ 24 апреля 2019

Эффективный и чистый способ обработки файла только после определенного момента

last if /#start_reading/ while <$csv_file>;  # get past that point in file

while (<$csv_file>) { print }                # now work on it
2 голосов
/ 09 апреля 2019
 perl -ne 's/.+\,#start_reading\s*/next/e; print $_' d

от gnu sed, если ваши данные в 'd',

 sed -En '/.+,#start_reading/{:s n; $q;p; bs }' d
...