我知道在此站点上有很多有关将多行正则表达式与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
答案 0 :(得分:4)
我认为您的输入中有回车换行符。您只需替换换行符,但回车符仍然存在。
您可以将\v
用于垂直空格(比行尾略多),将\R
匹配到通用Unicode行尾,将[\r\n]+
匹配(单独或一起),或者\r\n
,如果您确定它们都将在那儿。诀窍是如果行尾发生变化,则选择一种适合您的方法。
而且,替换方的\1
最好写成$1
。