0

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

__Data__
test1 - results
dkdkdkdkdkd

我希望输出是这样的:

__Data__
test1 - results dkdkdkdkdkd

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

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

2 回答 2

2

如果你有一个多行字符串:

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

修饰符只使/s通配符.match \n,所以它会导致.*你的换行符啜泣并导致 match\n被替换到它出现的最后一个位置。根据您的数据,这可能很遥远。

/m修饰符在换行符处生成^$匹配字符串,所以不是那么有用。逃生会保留之前的\K任何内容,因此您无需在之后将其放回原处。

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

while (<>) {
    if (/^__Data__/) {
        $_ .= <>;  # add next line
        chomp;     # remove newline
        $_ .= <>;  # add third line
    }
    print;
}
于 2012-05-15T01:35:56.937 回答
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
>>

注意使用<<and>>来标记字符串的结尾;它在调试时通常会有所帮助。使用您喜欢的任何符号;只需将您显示的文本包含在此类标记中,以帮助您自己调试正在发生的事情。

(在适用于 x86/64 的 RHEL 5 上使用 Perl 5.12.1 进行了测试,但我认为代码与版本或平台无关。)

于 2012-05-15T01:34:19.410 回答