Perl многострочные регулярные выражения и удаление - PullRequest
0 голосов
/ 07 марта 2020

У меня есть текстовый файл, который я обрабатываю в скрипте perl. Как удалить 2 или более строк, которые содержат только *. Ввод:

some text
*
some text
*
*
some text
*
*
*

Я хочу, чтобы текст выглядел так:

some text
*
some text
*
some text
*

Ответы [ 3 ]

1 голос
/ 07 марта 2020

Вы можете прочитать весь файл.

perl -0777pe's/^\*\n\K(\*\n)+//mg'

(Выше не будет работать так, как написано, если в последней строке отсутствует терминатор строки.)

Рабочая строка от Строка также довольно проста, так как не нужно заглядывать в будущее.

perl -ne'print if !$flag || !/^\*$/; $flag = /^\*$/;'

Указание файла для обработки Perl однострочный

0 голосов
/ 07 марта 2020

Вы можете выплескивать или в любом случае считывать весь файл в строку (сегодня на компьютере должно быть достаточно памяти для этого) и заменять любую последовательность специальных строк только одной.

use English;
my $contents = do { local $/; <> };
chomp $contents;
$contents .= $RS;
$contents =~ s/^(\*$RS)+/\1/mg;

'm' Модификатор устанавливает якорь '^' для распознавания начала любой строки вместо начала всей строки.

0 голосов
/ 07 марта 2020

Другое возможное решение с «одним вкладышем»:

perl -0777 -pe "s/(\n\*)+/$1/g" regex_stars.txt

Вход

some text
*
some text
*
*
some text
*
*
*

Выход

some text
*
some text
*
some text
*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...