Соответствие и удаление символа новой строки в регулярном выражении perl mutiline
Я знаю, что на этом сайте есть множество вопросов о сопоставлении многострочных регулярных выражений с 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 ответ
Я думаю, что ваш вход имеет пару каретки возврата строки. Вы только заменяете новую строку, но возврат каретки все еще там.
Вы можете соответствовать \v
для вертикальных пробелов (немного больше, чем окончания строк), \R
для обобщенного окончания строки Unicode, [\r\n]+
чтобы получить (по отдельности или вместе), или \r\n
если ты уверен, что они оба будут там. Хитрость заключается в том, чтобы выбрать тот, который работает для вас, если конец строки меняется.
И, \1
на стороне замены лучше написано как $1
,