Вы, кажется, хочет печатать строки, которые соответствуют один из три категории.
__Data__
маркеры
- тест линии SCSI
- пустые строки
режим пункт в Perl удобен, когда он работает, но это хрупкое. Пункты завершаются точно последовательностью "\n\n"
, но редакторы, которые не отображают пробелы, могут сделать это сложным для отладки, когда у вас есть пустая, но не пустая строка после абзаца.
Как указано в вашем вопросе, приведенный ниже код производит требуемый результат.
#! /usr/bin/env perl
use strict;
use warnings;
use 5.10.0; # smart matching
*ARGV = *DATA; # for demo only
my @interesting_line = (qr/^__Data__/, qr/SCSI - test-/, qr/^\s*$/);
while (<>) {
print if $_ ~~ @interesting_line;
print "\n" if eof && !eof();
}
__DATA__
__Data__
SCSI - test-A
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
__Data__
SCSI - test-B
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
__Data__
SCSI - test-C
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
В реальном использовании, вы должны удалить строку, отмеченную для демонстрации только, а затем предоставить один или несколько файлов данных в командной строке. Забавно выглядящий тест if eof && !eof()
пытается определить, когда нужно вставлять дополнительные разделители между записями. Если вы хотите, чтобы это было правильно, вам нужно быть более преднамеренным.
Ниже приведен пример ввода нескольких файлов.
$ cat input1
__Data__
SCSI - test-A
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
__Data__
SCSI - test-B
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
$ cat input2
__Data__
SCSI - test-C
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
$ ./extract-tests input1 input2
__Data__
SCSI - test-A
__Data__
SCSI - test-B
__Data__
SCSI - test-C
спасибо BRPocock, ваше предложение frist прекрасно работает, но отображается дополнительная __Data__. –