如何在不删除\ n的情况下删除\ r?

时间:2016-10-13 13:45:53

标签: regex perl newline carriage-return

所以我会尽量让它变得简单。我正在格式化文件。这些是脚本应完成的任务:

  1. 删除\r\n
  2. 删除&
  3. #A替换为\n#A
  4. #D替换为\n#D
  5. 我的代码已经开始工作,但它也会在添加的每个\r前面添加\n,这是我不想要的,因为程序无法识别\r想要将我的文件导入。您是否知道只删除\r而不删除\n的方法?

    这是我的代码。我想只有最后一个$data =~ s!\r!!g;是相关的。为什么这不像是故意的?每行后仍有\r\n ...

    opendir my $dir_a, $scriptdir or die "Kann Verzeichnis nicht oeffnen: $!";
    my @stammdateien = grep { /root/ } readdir $dir_a;
    closedir $dir_a;
    
    foreach my $stammdatei (@stammdateien){
    if ($stammdatei eq "root101" or $stammdatei eq "root112" or    $stammdatei eq "root116"){
        my $stammdateipfad = "$scriptdir\\$stammdatei";
        my $data = lese_file($stammdateipfad);
        $data =~ s!\r|\n!!g;
        $data =~ s!&!!g;
        $data =~ s!#A!\n#A!g;
        $data =~ s!#D!\n#D!g;
        $data =~ s!#M \| INSERT \|!#M \| UPDATE_INSERT \|!g;
        $data =~ s!\r!!g;
        schreibe_file($stammdateipfad, $data);  
    }
    }
    
    sub lese_file {
    my ($stammdatei) = @_;
    open my $in, "<", $stammdatei or die "Konnte die Datei '$stammdatei' nicht zum lesen oeffnen: $!";
    local $/ = undef;
    my $all = <$in>;
    close $in;
    return $all;
    }
    
    
    sub schreibe_file {
    my ($stammdateipfadout, $data) = @_;
    my $outputdatei = "$stammdateipfadout"."_CONVERTED";
    open my $out, ">", "$outputdatei" or die "Konnte die Datei $outputdatei nicht zum schreiben oeffnen: $!";
    print $out $data;
    close $out;
    print "====> Vorgang abgeschlossen!\n\n";
    return;
    }
    

1 个答案:

答案 0 :(得分:4)

您是否在Windows平台上?默认IO层在Windows上将\n转换为\r\n。要禁用它,请尝试以下方法之一:

open my $out, ">", "$outputdatei" or ...;
binmode $out;

open my $out, ">:raw", "$outputdatei" or