Соответствие и удаление символа новой строки в регулярном выражении mutiline perl - PullRequest
0 голосов
/ 26 августа 2018

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

У меня есть текстовый файл input.txt, структурированный с меткой поля (идентифицируемой обратной косой чертой) и содержимым поля, например:

\x text
\y text text
text text
\z text

Содержимое поля может содержать разрывы строк, но для дальнейшей обработки мне нужно убедиться, что все содержимое полей находится в одной строке. Следующее, по-видимому, может корректно сопоставлять в нескольких строках, однако не удаляет его, а вместо этого вставляет заново.

#!/usr/bin/perl

$/ =undef; 

{
open(my $in, "<", "input.txt") or die "impossible: $!";
open(my $out, ">", "output.txt") or die "Can't open output.txt: $!"; 

while (<$in>) {
    s/\n([^\\])/ \1/g; # delete all line breaks unless followed by backslash and replace by a single space
    print $out $_ ; 
    }       
}

Он добавляет пробел вперед (так что я знаю, что он правильно его находит), но, тем не менее, сохраняет символ новой строки. Вывод выглядит так:

\x text
\y text text
 text text
\z text

В то время как я надеялся получить это:

\x text
\y text text text text
\z text

1 Ответ

0 голосов
/ 26 августа 2018

Я думаю, что ваш ввод содержит пару символов возврата каретки.Вы заменяете только новую строку, но возврат каретки все еще там.

Вы можете сопоставить \v для вертикального пробела (немного больше, чем окончания строки), \R для обобщенного окончания строки Unicode, [\r\n]+, чтобы получить (отдельно или вместе), или \r\n, если вы уверены, что они оба будут там.Хитрость заключается в том, чтобы выбрать тот, который работает для вас, если конец строки меняется.

И, \1 на стороне замены лучше записать как $1.

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