如何使用Perl将两条线组合在一起?

时间:2012-05-15 01:22:06

标签: perl

如何使用Perl将两条线组合在一起?我正在尝试使用Perl正则表达式组合这两行:

__Data__
test1 - results
dkdkdkdkdkd

我希望输出如下:

__Data__
test1 - results dkdkdkdkdkd

我认为这会实现这一目标但不起作用:

$_ =~ s/__Data__\n(test1.*)\n(.*)\n/__Data__\n$1 $2/smg;

2 个答案:

答案 0 :(得分:2)

如果您有多行字符串:

s/__Data__\ntest1.*\K\n//g;

/s修饰符只会使通配符.\n匹配,因此会导致.*篡改换行符并导致\n的匹配被置换到最后发生的地方。根据您的数据,这可能远远不够。

/m修饰符使得^$在换行符中的字符串内匹配,因此不太有用。 \K转义会保留前面的任何内容,因此您不需要在之后将其恢复。

如果你有一个单行字符串,例如在while循环中:

while (<>) {
    if (/^__Data__/) {
        $_ .= <>;  # add next line
        chomp;     # remove newline
        $_ .= <>;  # add third line
    }
    print;
}

答案 1 :(得分:1)

$_的设置似乎存在问题。当我运行这个脚本时,我得到了我期望的输出(以及我认为你期望的输出)。主要区别在于我在替代模式的替换模式末尾添加了换行符。其余的是化妆品或测试基础设施。

脚本

#!/usr/bin/env perl
use strict;
use warnings;

my $text = "__Data__\ntest1 - results\ndkdkdkdkdkd\n";
my $copy = $text;

$text =~ s/__Data__\n(test1.*)\n(.*)\n/__Data__\n$1 $2\n/smg;

print "<<$copy>>\n";
print "<<$text>>\n";

输出

<<__Data__
test1 - results
dkdkdkdkdkd
>>
<<__Data__
test1 - results dkdkdkdkdkd
>>

请注意使用<<>>来标记字符串的结尾;它通常有助于调试。使用你喜欢的任何符号;只需将显示的文本放在这些标记中,以帮助自己调试正在进行的操作。

(在RHEL 5上针对x86 / 64测试了Perl 5.12.1,但我认为代码不依赖于版本或平台。)