wake-up-neo.com

Wie entferne ich in Perl ^ M aus einer Datei?

Ich habe ein Skript, das neue Felder an eine vorhandene CSV anfügt. Am Ende der alten Zeilen werden jedoch ^M-Zeichen angezeigt, sodass die neuen Felder in einer neuen Zeile und nicht in derselben Zeile enden. Wie entferne ich ^M-Zeichen aus einer CSV-Datei mit Perl?

33
Alex Wong

Sie haben herausgefunden, dass Sie das auch können:

$line=~ tr/\015//d;
14
Alex Wong

^ M ist Wagenrücklauf. Du kannst das:

$str =~ s/\r//g
46
Can Berk Güder

Oder ein 1-Liner:

Perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
23
JDrago

Etwas nicht verwandt, aber um ^ M mit Perl von der Befehlszeile zu entfernen, gehen Sie folgendermaßen vor:

Perl -p -i -e "s/\r\n/\n/g" file.name
7
Roy Rico

Ich bevorzuge eine allgemeinere Lösung, die entweder mit DOS- oder Unix-Eingaben funktioniert. Angenommen, die Eingabe stammt von STDIN:

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

    # filter and write
  }
6
KillerRabbit

Dieser eine Liner ersetzt alle ^ M-Zeichen:

dos2unix <file-name>

Sie können dies von innerhalb von Perl oder direkt von Ihrem Unix-Prompt aus aufrufen.

2
Akhil

So konvertieren Sie den DOS-Stil in UNIX-Stil-Zeilenenden:

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

Oder um UNIX- und/oder DOS-Zeilenenden zu entfernen:

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

Das hat mein Problem gelöst. ^ M ist ein Wagenrücklauf und kann in einem Perl-Skript leicht vermieden werden.

while(<INPUTFILE>)
{
     chomp;
     chop($_) if ($_ =~ m/\r$/);
}
1
user3274263

Kleines Drehbuch habe ich dafür. Durch diese Änderung konnten einige nicht druckbare Zeichen in plattformübergreifenden älteren Dateien herausgefiltert werden.

#!/usr/bin/Perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;