Я пытаюсь разобрать файл в 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
......
заранее спасибо
Вы можете установить флаг, когда строка содержит #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/;
}
while (<$csv_file>) { print if $start; $start ||= /#start_reading/; }
Спасибо, а как перестать читать? Я хочу перестать читать после #stop_reading, спасибо
@JigarVaidya Я обновил свой ответ решением для остановки.
@blhsing скрипт не останавливается после #stop_reading, он все равно читает до конца... мой код push @loop_reg, $line if $print; $print ||= $line =~ m/#lane_loop_start/; $print &&= $line !~ m/#lane_loop_stop/;
Вы также можете использовать оператор триггера (..
), чтобы обойти все строки с начала файла до строки, содержащей #start_reading
while (<$fh>) {
next if 1 .. /#start_reading/;
print;
}
Это обходит печать от строки 1 файла до строки, соответствующей #start_reading
. Затем он печатает оставшиеся строки в файле.
perl -ne 's/.+\,#start_reading\s*/next/e; print $_' d
по gnu sed, если ваши данные в 'd',
sed -En '/.+,#start_reading/{:s n; $q;p; bs }' d
Эффективный и чистый способ обработки файла только после определенного момента
last if /#start_reading/ while <$csv_file>; # get past that point in file
while (<$csv_file>) { print } # now work on it
Этого можно добиться с помощью приведенной ниже команды. /xxx/../yyy/
позволяет perl печатать текст между двумя совпадениями. В вашем случае второе совпадение — это просто конец файла, поэтому используйте ключевое слово EOF
.
perl -ne 'print if /^match/../EOF/'
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре: stackoverflow.com/help/how-to-answer . Удачи ?
Можете ли вы показать, как выглядит входной файл, отредактировав свой пост?