在多行perl正则表达式中匹配和删除换行符

Matching and deleting newline character in mutiline perl regex

我知道在这个站点上有很多关于将多行正则表达式与 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([^\])/ /g; # delete all line breaks unless followed by backslash and replace by a single space
    print $out $_ ; 
    }       
}

它将 space 添加到前面(所以我知道它正确地找到了它)但仍然保留换行符。输出如下所示:

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

虽然我希望得到这个:

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

我认为您的输入有一个回车 return-换行符对。您只是替换了换行符,但回车 return 仍然存在。

您可以为垂直空格匹配 \v(比行结尾多一点),为通用 Unicode 行结尾匹配 \R,为(单个或一起)匹配 [\r\n]+ , 或者 \r\n 如果你确定他们都在那里。诀窍是在行尾发生变化时选择适合您的一种。

而且,替换端的</code>最好写成<code>