Perl регулярное выражение для печати всех вхождений сопоставленного шаблона от вхождения слова «ххх» до вхождения слова «гггг» - PullRequest
0 голосов
/ 04 декабря 2018

файл имеет

sub TC1
{

check(CLEANUP_SUB=>\&cleanup1);
check(CLEANUP_SUB=>\&cleanup2);
check(CLEANUP_SUB=>\&cleanup3);
endcase
}

sub TC2
{
check(CLEANUP_SUB=>\&cleanup4);
check(CLEANUP_SUB=>\&cleanup5);
check(CLEANUP_SUB=>\&cleanup6);
endcase();
}

Ожидаемый вывод

\&cleanup1
\&cleanup2
\&cleanup3

Я хочу, чтобы весь шаблон после / sub TC1 / до первого появления / endcase /

perl -0777 -ne 'if(/sub\sTC1/){while(/CLEANUP_SUB\s*=>([^),;]+)/g){print "$&\n";}}' file

Вывод

\&cleanup1
\&cleanup2
\&cleanup3
\&cleanup4
\&cleanup5
\&cleanup6

1 Ответ

0 голосов
/ 04 декабря 2018

Используйте оператор триггера (..).

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

while (<>) {
  if (/sub TC1/ .. /endcase/) {
    /CLEANUP_SUB\s*=>([^),;]+)/ and say $1;
  }
}

Или (в качестве однострочного):

$ perl -nE '/sub TC1/ .. /endcase/ and /CLEANUP_SUB\s*=>([^),;]+)/ and say $1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...