合并以“+”开头的延续线

时间:2016-05-19 07:59:03

标签: regex perl multiline

我知道这是一个多次被问到的问题,我找不到能回答我特定问题的答案。

基本上,我有一个输入文件,其中一些行以+字符串开头。这些行必须附加在上一行的末尾,并且必须删除+字符。所以

abc
def
+ ghj
klm

应该成为

abc
def ghj
klm

这是我通过查看其他答案而制作的perl命令

perl -pe 's/\n\+ //m' < input

但它会打印输入文件而不更改它。奇怪的是,在像regex101.com这样的网站上,我的正则表达式会产生预期的结果。

我错过了什么?

3 个答案:

答案 0 :(得分:3)

据推测,这些文件相对较小,很容易融入内存?

这是最简单的方式

use strict;
use warnings 'all';

my $data = do {
    local $/;
    <DATA>;
};

$data =~ s/\n\+//g;

print $data;

__DATA__
abc
def
+ ghj
klm

输出

abc
def ghj
klm

在Perl单行中将是

perl -0777 -pe 's/\n\+//g' < input

答案 1 :(得分:2)

您可以将输入记录分隔符$/更改为字符串"\n+" (或Windows文件的"\r\n+",然后您只需要选择每个记录:

perl -pe 'BEGIN{$/="\n+"}chomp' file

答案 2 :(得分:1)

@Borodin为您的问题提供了一个很好的解决方案。此外,如果您需要将其更新到旧文件中,只需添加&#34; -i&#34;:

perl -0777 -i -pe 's/\n\+//g' input

或者如果要将源文件保留为备份,请使用:

perl -0777 -i.bak -pe 's/\n\+//g' input

这将生成一个名为input.bak的文件,以防您想要恢复。