por linea leer archivos archivo perl carriage-return hidden-characters

linea - En Perl, ¿cómo eliminar ^ M de un archivo?



archivos en perl (10)

Tengo un script que agrega nuevos campos a un CSV existente, sin embargo, aparecen ^M caracteres al final de las líneas anteriores, por lo que los nuevos campos terminan en una nueva fila en lugar de la misma. ¿Cómo elimino ^M caracteres de un archivo CSV usando Perl?


Descubriste que también puedes hacer esto:

$line=~ tr//015//d;


Este trazador de líneas substituye todos los ^ M caracteres:

dos2unix <file-name>

Puede llamar esto desde Perl o directamente en su solicitud de Unix.


Esto es lo que resolvió mi problema. ^ M es un retorno de carro, y se puede evitar fácilmente en un script de Perl.

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


In vi hit :

Entonces s/Control-VControl-M//g .

Control-V Control-M son obviamente esas teclas. No lo deletree.


Ligeramente sin relación, pero para eliminar ^ M de la línea de comandos con Perl, haz esto:

perl -p -i -e "s//r/n//n/g" file.name


O un 1-liner:

perl -p -i -e ''s//r/n$//n/g'' file1.txt file2.txt ... filen.txt


Para convertir el estilo de DOS en terminaciones de línea de estilo UNIX:

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

O bien, para eliminar los finales de línea de estilo UNIX y / o DOS:

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


Pequeño guion que tengo para eso. Una modificación de este ayudó a filtrar algunos otros caracteres no imprimibles en archivos heredados multiplataforma.

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


Prefiero una solución más general que funcione con entrada de DOS o Unix. Suponiendo que la entrada es de STDIN:

while (defined(my $ln = <>)) { chomp($ln); chop($ln) if ($ln =~ m//r$/); # filter and write }


^ M es el retorno de carro. Puedes hacerlo:

$str =~ s//r//g