在Mutiline Perl正则表达式中匹配和删除换行符

时间:2018-08-26 19:47:54

标签: regex perl multiline multilinestring

我知道在此站点上有很多有关将多行正则表达式与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 :(得分:4)

我认为您的输入中有回车换行符。您只需替换换行符,但回车符仍然存在。

您可以将\v用于垂直空格(比行尾略多),将\R匹配到通用Unicode行尾,将[\r\n]+匹配(单独或一起),或者\r\n,如果您确定它们都将在那儿。诀窍是如果行尾发生变化,则选择一种适合您的方法。

而且,替换方的\1最好写成$1