Perl 如何在文件中放置或删除某些换行符

Perl 如何在文件中放置或删除某些换行符,perl,replace,line-breaks,line-by-line,Perl,Replace,Line Breaks,Line By Line,我有一个包含大约70000条记录的文件,其结构大致如下: 01499 1000642 4520101000900000 ...more numbers... 104000900169 +Fieldname1 -Content +Fieldname2 -Content -Content -Content +Fieldname3 -Content -Content +Fieldname4 -Content +Fieldname5 -Content -Content -Content -C

我有一个包含大约70000条记录的文件,其结构大致如下:

01499     1000642   4520101000900000
...more numbers...
104000900169
+Fieldname1
-Content
+Fieldname2
-Content
-Content
-Content
+Fieldname3
-Content
-Content
+Fieldname4
-Content
+Fieldname5
-Content
-Content
-Content
-Content
-Content
-Content

01473     1000642   4520101000900000
...more numbers...
01499     1000642   4520101000900000
...more numbers...
104000900169
+Fieldname1
-Content
+Fieldname2
-Content Content Content
+Fieldname3
-Content Content
+Fieldname4
-Content
+Fieldname5
-Content
-Content
-Content
-Content
-Content
-Content

01473     1000642   4520101000900000
...more numbers...
编辑1:因此,每条记录都以一列数字开始,以空行结束。在这一空行之前,大多数记录都有一个
+字段名5
和一个或多个
-内容
行。

我想做的是将所有多行条目合并为一行,同时将前导减号替换为空格,但与最后一个字段(即本例中的Fieldname5)相关的空格除外

应该是这样的:

01499     1000642   4520101000900000
...more numbers...
104000900169
+Fieldname1
-Content
+Fieldname2
-Content
-Content
-Content
+Fieldname3
-Content
-Content
+Fieldname4
-Content
+Fieldname5
-Content
-Content
-Content
-Content
-Content
-Content

01473     1000642   4520101000900000
...more numbers...
01499     1000642   4520101000900000
...more numbers...
104000900169
+Fieldname1
-Content
+Fieldname2
-Content Content Content
+Fieldname3
-Content Content
+Fieldname4
-Content
+Fieldname5
-Content
-Content
-Content
-Content
-Content
-Content

01473     1000642   4520101000900000
...more numbers...
我现在看到的是(改编自):


假设只有以“-”开头的行是这些多行部分,您可以这样做

# Open $in and $out as in your original code...

my $insideMultiline = 0;
my $multilineBuffer = "";

LINE:
while (<$in>) {
    if (/^-/) {
        chomp;
        if ($insideMultiline) {
            s/^-/ /;
            $multilineBuffer .= $_;
        }
        else {
            $insideMultiline = 1;
            $multilineBuffer = $_;
        }
        next LINE;
    }
    else {
        if ($insideMultiline) {
            print $out "$multilineBuffer\n";
            $insideMultiline = 0;
            $multilineBuffer = "";
        }
        print $out $_;
    }
}
#在原始代码中打开$in和$out。。。
我的$insideMultiline=0;
我的$multilebuffer=“”;
行:
而(){
如果(/^-/){
咀嚼;
如果($insideMultiline){
s/^-/;
$multiliebuffer.=$\uu1;
}
否则{
$insideMultiline=1;
$multiliebuffer=$\uu1;
}
下一行;
}
否则{
如果($insideMultiline){
打印$out“$multilineBuffer\n”;
$INIDEMULTILINE=0;
$multilebuffer=“”;
}
打印$out$;
}
}
至于嵌入的子问题(“与最后一个字段相关的子问题除外”),我需要更多关于文件格式的详细信息才能做到这一点。看起来像是一条空行将字段集和内容集彼此分开,但在描述中这并不是100%清楚。不过,上面的代码应该能够处理您在底部列出的需求