Привет, друзья из StackOverflow,
Я на платформе Windows ;У меня есть файл данных, но что-то не так произошло, и (я не знаю почему) все комбинации «Возврат каретки + Новая строка» стали «Возврат каретки + Возврат каретки + Новая строка», (редактирование 190128:) Например:
При просмотре файла в виде обычного текста это:
При просмотре того же файла в шестнадцатеричном режиме, это:
Из практических целей мне нужно удалить лишние "0D" в двойных "0D", таких как ".... 30 30 0D 0D 0A 30 30 ....
"и измените его на ".... 30 30 0D 0A 30 30 ....
".
190129 edit: Кроме того, чтобы убедиться, что моя проблема может быть воспроизведена, я загрузил свой файл данных в GitHub по адресу URL (следует загрузить &распакуйте его перед использованием; в двоичном редакторе \ hex вы можете 0D 0D 0A
в первой строке): https://github.com/katyusza/hello_world/blob/master/ram_init.zip
Я использовал следующий скрипт на Perl, чтобы удалить дополнительный возврат каретки, но, к моему удивлению, мое регулярное выражениепросто НЕ работает !!Весь мой код ( 190129 edit : прошёл весь сценарий Perl здесь):
use warnings ;
use strict ;
use File::Basename ;
#-----------------------------------------------------------
# command line handling, file open \ create
#-----------------------------------------------------------
# Capture input input filename from command line:
my $input_fn = $ARGV[0] or
die "Should provide input file name at command line!\n";
# Parse input file name, and generate output file name:
my ($iname, $ipath, $isuffix) = fileparse($input_fn, qr/\.[^.]*/);
my $output_fn = $iname."_pruneNonPrintable".$isuffix;
# Open input file:
open (my $FIN, "<", $input_fn) or die "Open file error $!\n";
# Create output file:
open (my $FO, ">", $output_fn) or die "Create file error $!\n";
#-----------------------------------------------------------
# Read input file, search & replace, write to output
#-----------------------------------------------------------
# Read all lines in one go:
$/ = undef;
# Read entire file into variable:
my $prune_txt = <$FIN> ;
# Do match & replace:
$prune_txt =~ s/\x0D\x0D/\x0D/g; # do NOT work.
# $prune_txt =~ s/\x0d\x0d/\x30/g; # do NOT work.
# $prune_txt =~ s/\x30\x0d/\x0d/g; # can work.
# $prune_txt =~ s/\x0d\x0d\x0a/\x0d\x0a/gs; # do NOT work.
# Print end time of processing:
print $FO $prune_txt ;
# Close files:
close($FIN) ;
close($FO) ;
Я сделал всё, что мог, чтобы соответствовать двум последовательным возвратам каретки, но не смог.Может ли кто-нибудь указать на мою ошибку или сказать мне правильный путь?Заранее спасибо!