如何使用Perl将两条线组合在一起?我正在尝试使用Perl正则表达式组合这两行:
__Data__
test1 - results
dkdkdkdkdkd
我希望输出如下:
__Data__
test1 - results dkdkdkdkdkd
我认为这会实现这一目标但不起作用:
$_ =~ s/__Data__\n(test1.*)\n(.*)\n/__Data__\n$1 $2/smg;
答案 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,但我认为代码不依赖于版本或平台。)