Perl удалить несколько строк, которые соответствуют регулярному выражению - PullRequest
0 голосов
/ 06 марта 2020

У меня есть файл, который выглядит следующим образом:

*
TEST CASE1,
$ some text unque633
PLACEMENT 123
*
TEST CASE2,
$ some text unque759
PLACEMENT 321
*
TEST CASE3,
$ some text unque966
PLACEMENT 856
*

Я хочу удалить несколько строк, которые соответствуют регулярному выражению. Например, необходимо удалить, начиная с TEST CASE2 до строки, начинающейся с *. Как это можно сделать в скрипте perl. Кроме того, как я могу редактировать текст из TEST CASE2, если я знаю только unque759. Очень ценится.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Желаемая цель может быть легко достигнута с помощью следующего алгоритма: считывание всех данных в переменную, замена блока 'TEST CASE2 .....' перед следующим '*' в ноль, выходной результат

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

my $data = do { local $/; <DATA> };     # read all data at once

$data =~ s/TEST CASE2[^*]*//s;          # substitute requested block with nothing

say $data;

__DATA__
*
TEST CASE1,
$ some text
PLACEMENT 123
*
TEST CASE2,
$ some text
PLACEMENT 321
*
TEST CASE3,
$ some text
PLACEMENT 856
*

Выход

*
TEST CASE1,
$ some text
PLACEMENT 123
*
*
TEST CASE3,
$ some text
PLACEMENT 856
*
1 голос
/ 06 марта 2020

Это удалит блоки, начинающиеся с TEST CASE2,, заканчивающиеся * и содержащие unque759

cat file.txt 
*
TEST CASE1,
$ some text unque633
PLACEMENT 123
*
TEST CASE2,
$ some text unque759
PLACEMENT 321
*
TEST CASE2,
$ some text unque999
PLACEMENT 321
*
TEST CASE3,
$ some text unque966
PLACEMENT 856
*

perl -0777 -ape 's/TEST CASE2,[^*]+?\bunque759\b[^*]+?\*(?:\R|\z)//' file.txt 
*
TEST CASE1,
$ some text unque633
PLACEMENT 123
*
TEST CASE2,
$ some text unque999
PLACEMENT 321
*
TEST CASE3,
$ some text unque966
PLACEMENT 856
*

Объяснение:

-0777            # “slurp” mode, read the file in a single string
s/               # substitute
    TEST CASE2,     # literally
    [^*]+?          # 1 or more non asterisk, not greedy
    \b              # word boundary
    unque759        # literally
    \b              # word boundary
    [^*]+?          # 1 or more non asterisk, not greedy
    \*              # an asterisk
    (?:\R|\z)       # non capture group, end of line OR end of string
//               with nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...