В Perl как удалить ^ M из файла? - PullRequest
33 голосов
/ 16 марта 2009

У меня есть скрипт, который добавляет новые поля к существующему CSV, однако ^M символы появляются в конце старых строк, поэтому новые поля оказываются в новой строке вместо той же самой. Как удалить ^M символов из файла CSV с помощью Perl?

Ответы [ 10 ]

46 голосов
/ 16 марта 2009

^ M - возврат каретки. Вы можете сделать это:

$str =~ s/\r//g
23 голосов
/ 16 марта 2009

или 1 вкладыш:

perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
14 голосов
/ 16 марта 2009

Вы узнали, что вы также можете сделать это:

$line=~ tr/\015//d;
7 голосов
/ 16 марта 2009

Немного не связано, но чтобы удалить ^ M из командной строки, используя Perl, сделайте это:

perl -p -i -e "s/\r\n/\n/g" file.name
6 голосов
/ 05 августа 2013

Я предпочитаю более общее решение, которое будет работать с вводом DOS или Unix. Предполагая, что ввод от STDIN:

while (defined(my $ln = <>))
  {
    chomp($ln);
    chop($ln) if ($ln =~ m/\r$/);

    # filter and write
  }
2 голосов
/ 04 августа 2012

Этот вкладыш заменяет все символы ^ M:

dos2unix <file-name>

Вы можете вызвать это изнутри Perl или непосредственно в приглашении Unix.

1 голос
/ 17 марта 2016

Это то, что решило мою проблему. ^ M - это возврат каретки, и его легко избежать в скрипте Perl.

while(<INPUTFILE>)
{
     chomp;
     chop($_) if ($_ =~ m/\r$/);
}
1 голос
/ 16 марта 2009

Чтобы преобразовать стиль DOS в окончания строк в стиле UNIX:

for ($line in <FILEHANDLE>) {
   $line =~ s/\r\n$/\n/;
}

Или, чтобы удалить окончания строк в стиле UNIX и / или DOS:

for ($line in <FILEHANDLE>) {
   $line =~ s/\r?\n$//;
}
0 голосов
/ 18 сентября 2016

Небольшой сценарий, который у меня есть для этого. Его модификация помогла отфильтровать некоторые другие непечатаемые символы в кроссплатформенных устаревших файлах.

#!/usr/bin/perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
0 голосов
/ 16 марта 2009

В ви хит :.

Тогда s/Control-VControl-M//g.

Control-V Control-M, очевидно, эти ключи. Не разъясняй это.

...