【问题标题】:How do I remove \r without removing \n?如何在不删除 \n 的情况下删除 \r?
【发布时间】:2016-10-13 13:45:52
【问题描述】:

所以我会尽量简化。我现在正在格式化文件。这些是脚本应该完成的任务:

  1. 删除\r\n
  2. 删除&
  3. #A 替换为\n#A
  4. #D 替换为\n#D

我的代码已经在运行,但它还在每个添加的 \n 前面添加了 \r,这是我不想要的,因为我想要将文件导入到的程序无法识别 \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;
}

【问题讨论】:

  • $data =~ s![\r\n]+!\n!g;$data =~ s![\r\n]+$!\n!g;
  • @ssr1012 很遗憾没有工作,当在记事本++中加载“显示所有字符”时,它仍然在每一行的末尾显示 CR LF

标签: regex perl newline carriage-return


【解决方案1】:

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

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

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

【讨论】:

  • 我也是这么想的。
  • 是的,这很好用,谢谢! :) 编辑:使用了binmode $out; 变体!
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2018-11-25
  • 2011-07-14
  • 2014-11-10
  • 2015-01-13
  • 1970-01-01
  • 2021-05-10
  • 2021-04-04
相关资源
最近更新 更多