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