web-dev-qa-db-fra.com

En Perl, comment supprimer ^ M d'un fichier?

J'ai un script qui ajoute de nouveaux champs à un fichier CSV existant. Cependant, les caractères ^M apparaissent à la fin des anciennes lignes. Ainsi, les nouveaux champs se retrouvent sur une nouvelle ligne au lieu de la même. Comment supprimer des caractères ^M d'un fichier CSV à l'aide de Perl?

33
Alex Wong

Vous avez découvert que vous pouvez aussi faire ceci:

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

^ M est le retour chariot. Tu peux le faire:

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

Ou un 1-liner:

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

Légèrement sans rapport, mais pour supprimer ^ M de la ligne de commande à l'aide de Perl, procédez comme suit:

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

Je préfère une solution plus générale qui fonctionnera avec une entrée DOS ou Unix. En supposant que l'entrée provienne de STDIN:

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

    # filter and write
  }
6
KillerRabbit

Ce liner remplace tous les ^ M caractères:

dos2unix <file-name>

Vous pouvez appeler cela depuis Perl ou directement sur votre invite Unix.

2
Akhil

Pour convertir le style DOS en fins de ligne de style UNIX:

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

Ou, pour supprimer les fins de ligne de style UNIX et/ou DOS:

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

C'est ce qui a résolu mon problème. ^ M est un retour chariot et peut être facilement évité dans un script Perl.

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

Petit script que j'ai pour ça. Une modification de celui-ci a permis de filtrer certains autres caractères non imprimables dans les fichiers hérités multi-plateformes.

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