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

jan*_*jan 1 regex perl multiline multilinestring

我知道这个网站上有很多关于将多行正则表达式与 perl 匹配的问题,但是,我仍然无法弄清楚如何执行以下操作。因此,任何帮助或相关问题的链接将不胜感激。

我有一个input.txt由字段标签(由反斜杠标识)和字段内容构成的文本文件,如下所示:

\x text
\y text text
text text
\z text
Run Code Online (Sandbox Code Playgroud)

字段内容可以包含换行符,但为了进一步处理,我需要确保所有字段内容都在一行上。以下显然能够跨多行正确匹配,但是,它不会删除它,而是重新插入它。

#!/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 $_ ; 
    }       
}
Run Code Online (Sandbox Code Playgroud)

它将空格添加到前面(所以我知道它正确地找到了它),但仍然保留了换行符。输出看起来像这样:

\x text
\y text text
 text text
\z text
Run Code Online (Sandbox Code Playgroud)

而我希望得到这个:

\x text
\y text text text text
\z text
Run Code Online (Sandbox Code Playgroud)

bri*_*foy 5

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

您可以匹配\v垂直空白(比行结尾多一点)、\R通用 Unicode 行结尾,[\r\n]+以获取其中之一(单独或一起),或者\r\n如果您确定它们都会在那里。诀窍是选择一个适合您的行尾变化的方法。

并且,\1替换侧的 最好写成$1.