В Perl как удалить ^M из файла?
У меня есть скрипт, который добавляет новые поля к существующему CSV, однако ^M
символы появляются в конце старых строк, поэтому новые поля попадают в новую строку вместо той же самой. Как мне удалить ^M
символы из файла CSV, используя Perl?
11 ответов
Вы узнали, что вы также можете сделать это:
$line=~ tr/\015//d;
Или 1-лайнер:
perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
Немного не связанный, но чтобы удалить ^M из командной строки, используя Perl, сделайте это:
perl -p -i -e "s/\r\n/\n/g" file.name
Я предпочитаю более общее решение, которое будет работать с вводом DOS или Unix. Предполагая, что ввод от STDIN:
while (defined(my $ln = <>))
{
chomp($ln);
chop($ln) if ($ln =~ m/\r$/);
# filter and write
}
Этот вкладыш заменяет все символы ^M:
dos2unix <file-name>
Вы можете вызвать это изнутри Perl или прямо в приглашении Unix.
Чтобы преобразовать стиль DOS в окончания строк в стиле UNIX:
for ($line in <FILEHANDLE>) {
$line =~ s/\r\n$/\n/;
}
Или, чтобы удалить окончания строк в стиле UNIX и / или DOS:
for ($line in <FILEHANDLE>) {
$line =~ s/\r?\n$//;
}
Это то, что решило мою проблему. ^M - это возврат каретки, и его легко избежать в скрипте Perl.
while(<INPUTFILE>)
{
chomp;
chop($_) if ($_ =~ m/\r$/);
}
perl для преобразования строки dos, заканчивающейся в строку unix, заканчивающуюся резервной копией исходного файла:
perl -pi.bak -e 's/\r\n/\n/g' filename
Эта команда создает имя файла с окончанием строки unix и оставляет исходный файл как имя файла.bak.
Небольшой сценарий у меня есть для этого. Его модификация помогла отфильтровать некоторые другие непечатаемые символы в кроссплатформенных устаревших файлах.
#!/usr/bin/perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
В ви хит :
,
затем s/Control-VControl-M//g
,
Control-V
Control-M
очевидно, эти ключи. Не разъясняй это.