如何使用 Perl 将两条线组合在一起?我正在尝试使用 Perl 正则表达式组合这两行:
__Data__
test1 - results
dkdkdkdkdkd
我希望输出是这样的:
__Data__
test1 - results dkdkdkdkdkd
我认为这会实现这一点但不起作用:
$_ =~ s/__Data__\n(test1.*)\n(.*)\n/__Data__\n$1 $2/smg;
如何使用 Perl 将两条线组合在一起?我正在尝试使用 Perl 正则表达式组合这两行:
__Data__
test1 - results
dkdkdkdkdkd
我希望输出是这样的:
__Data__
test1 - results dkdkdkdkdkd
我认为这会实现这一点但不起作用:
$_ =~ s/__Data__\n(test1.*)\n(.*)\n/__Data__\n$1 $2/smg;
如果你有一个多行字符串:
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;
}
好像设置有问题$_
。当我运行这个脚本时,我得到了我期望的输出(以及我认为你期望的输出)。主要区别是我在替换模式的末尾添加了一个换行符。其余的是装饰或测试基础设施。
#!/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 进行了测试,但我认为代码与版本或平台无关。)