我需要您的专业帮助来使用 Perl 修复此正则表达式代码?
我有这个数据文件...
__Data__ SCSI - test-A ccccccccccccccccc aaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbb __Data__ SCSI - test-B ccccccccccccccccc aaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbb __Data__ SCSI - test-C ccccccccccccccccc aaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbb
I would like the following output
__Data__ SCSI - test-A __Data__ SCSI - test-B __Data__ SCSI - test-C
Instead, I'm getting this output which is missing the __Data__
for two of the data records.
__Data__ SCSI - test-A SCSI - test-B SCSI - test-C
Here the code..
$/ = "__Data__"; # setting the input separator variable to __Data__
while(<ReadFile>)
{
$_ =~ s/(SCSI.*test-(A|B|C)?)(.*)/$1/ms;
print $_;
}
最佳答案
你告诉 Perl 该行以 __DATA__
结尾,所以你得到了
1: "__Data__"
2: "\nSCSI - test-A\nccc\naaa\nbbb\n\n__Data__"
3: "\nSCSI - test-B\nccc\naaa\nbbb\n\n__Data__"
4: "\nSCSI - test-C\nccc\naaa\nbbb\n"
但是你错误地认为你得到了
1: "__Data__\nSCSI - test-A\nccc\naaa\nbbb\n\n"
2: "__Data__\nSCSI - test-B\nccc\naaa\nbbb\n\n"
3: "__Data__\nSCSI - test-C\nccc\naaa\nbbb\n"
解决方案:
my $after_data = 0;
while (<>) {
if (/^__Data__$/) {
print;
$after_data = 1;
}
elsif ($after_data) {
print;
print "\n";
$after_data = 0;
}
}
您还可以使用段落模式:
local $/ = '';
while (<>) {
print /^(.*\n.*\n)/;
print "\n";
}
关于regex - 需要帮助使用 Perl 修复此正则表达式代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644171/