Командная строка perl выводит строки между шаблонами только для последнего совпадения - PullRequest
0 голосов
/ 17 января 2020

Я ищу команду perl one liner для получения линий с шаблоном без жадного совпадения. PATTERN1 НЕКОТОРЫЕ ИНФОРМАЦИИ

TEXT1

TEXT2

TEXT3 PATTERN2 НЕКОТОРЫЕ ИНФОРМАЦИИ

PATTERN1 НЕКОТОРЫЕ ИНФОРМАЦИИ

TEXT4

TEXT5

TEXT6 PATTERN3 НЕКОТОРЫЕ ИНФОРМАЦИИ

Я знаю следующий код perl -ne 'print if (/PATTERN1/../PATTERN3/)' - жадное совпадение и печатает все.

Я хочу напечатать следующий вывод PATTERN1 НЕКОТОРЫЕ ИНФОРМАЦИИ TEXT4 TEXT5 TEXT6 PATTERN3 НЕКОТОРЫЕ ИНФОРМАЦИИ

Обратите внимание, что это очень большой файл, и он не может поместить весь файл в строка.

Спасибо, Рави

Ответы [ 2 ]

1 голос
/ 17 января 2020

Вы не можете «перезапустить» оператор триггера, так как это слишком просто c. Он прекращает поиск начального условия, пока не встретит конечное условие. Кроме того, этот код запускается один раз в каждой строке, поэтому к моменту перехода ко второму PATTERN1 предыдущие строки уже были напечатаны на выходе. Это означает, что для выполнения того, что вы хотите, вам нужно сделать две вещи: расширить алгоритм, чтобы вы могли настроить его, и обработать весь ввод перед выводом на печать (это не обязательно означает чтение всего этого в одну строку, но вы должны буферизируйте часть, на которую вы смотрите, пока вы не узнаете, печатать ли ее)

0 голосов
/ 17 января 2020

Вы можете попробовать что-то вроде этого, чтобы напечатать строки, ограниченные кратчайшим диапазоном PATTERN1 и PATTERN3:

use strict;
use warnings;

my $flag = 0;
my @lines;
while (<<>>) {
    if ( /PATTERN1/ ) {
        $flag = 1;
        @lines = ();
    }
    push @lines, $_ if $flag;
    if ( /PATTERN3/ ) {
        $flag = 0;
        print join "", @lines;
    }
}
...