Как мне удалить r, не удаляя n?

#regex #perl #newline #carriage-return

#регулярное выражение #perl #новая строка #возврат каретки

Вопрос:

поэтому я постараюсь сделать это как можно проще. Я форматирую файлы прямо сейчас. Это задачи, которые должен выполнить скрипт:

  1. Удалить rn
  2. Удалить amp;
  3. заменить #A на n#A
  4. заменить #D на n#D

Мой код уже работает, но он также добавляется r перед каждым n добавленным, и это то, чего я не хочу, потому r что не распознается программой, в которую я хочу импортировать свои файлы. Знаете ли вы метод только для удаления r , не удаляя также n ?

Вот мой код. Я думаю $data =~ s!r!!g; , имеет значение только последнее. Почему это не работает так, как задумано? rn После каждой строки все еще есть…

 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!amp;!!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!nn";
return;
}
 

Комментарии:

1. $data =~ s![rn] !n!g; или $data =~ s![rn] $!n!g;

2. @ssr1012, к сожалению, не работает, при загрузке с помощью «показать все символы» в notepad он по-прежнему показывает CR LF в конце каждой строки

Ответ №1:

Вы используете платформу Windows? Уровень ввода-вывода по умолчанию преобразуется n rn в Windows. Чтобы отключить это, попробуйте один из:

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

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

Комментарии:

1. Я просто подумал о том же.

2. да, это работает хорошо, спасибо! 🙂 редактировать: использовал binmode $out; вариант!