• Publicidad

Eliminar carácter especial fin de línea

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Eliminar carácter especial fin de línea

Notapor explorer » 2010-02-10 17:16 @761

Bueno, pues si estás en un sistema Windows, haces las DOS líneas que te he puesto antes, y listo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
chomp $linea;  # quita los caracteres de final de línea
chop  $linea;  # quita el 0 final
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


O la expresión regular...

$linea =~ s/\000\r\n$//;

Bueno, como no tengo Windows, no estoy seguro de si es la correcta, pero yo probaría antes con

$linea =~ s/\000\n$//;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14488
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Eliminar carácter especial fin de línea

Notapor rafical » 2010-02-10 17:46 @782

Excelente, ¡¡¡muchas gracias, explorer, por tu ayuda!!! :D
rafical
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-02-10 11:05 @503

Re: Eliminar carácter especial fin de línea

Notapor reLlene » 2013-01-17 15:20 @680

Revivo este hilo preguntando por lo mismo, quitar último (o últimos, por lo que veo) carácter de un binario que desde vim -b lo veo como ^M y mirando el mismo binario en hexadecimal se trata de 2 bytes, como ha dicho explorer más arriba, un salto de línea y un espacio vacío pareciera. El orden es 0x0d seguido de un 0x0a. y si los imprimo desde la terminal.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print chr(0x0d)
  2. # veo un blanco (no hay espacios)
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print chr(0x0a)
  2. # y aquí veo un salto de línea
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El punto es que estoy corriendo la siguiente línea que aquí del amigo explorer, que me la ha enseñado
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  perl -CO -pE 'use utf8; tr/\0x0a//;' archivobinario.txt > archivoresultante.txt
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y hecho esto, VUELVO a abrir el archivo con vim -b y sigo topándome con el ^M
También con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  perl -CO -pE 'use utf8; tr/\0x0d//;' archivobinario.txt > archivoresultante.txt
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o con las regexp que a continuación cito:

$linea =~ s/\000\r\n$//;

$linea =~ s/\000\n$//;


EDITO


He conseguido quitándole con la regexp

s/\n//g

pero es que al abrirlo nuevamente con vim -b sigo viendo el maldito ^M :oops: , aunque ésta vez TODO el texto está en una sola línea y vim abajo me dice "[no hay fin de línea]"

Luego le hago un hexdump a éste binario y veo que sigue allí el 0x0d, intento sacarlo con tr/\x0d// pero no hay caso, vuelvo a abrir vim -b archivo y sigue allí. Evidentemente me resta sacar éste para quitar el ^M ¿¿cierto?? :o
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Re: Eliminar carácter especial fin de línea

Notapor explorer » 2013-01-17 16:33 @731

No te fíes del vim. En algunas instalaciones, el vim viene configurado para agregar un carácter de nueva línea al final de la última línea, en caso de que no exista ese carácter. Esto se hace así porque durante muchos años, los programadores cometían el error de no poner ese último carácter, y afectaba al funcionamiento de otros programas. Por eso, como esos programadores usaban vi (o vim), se puso esa condición al editor: agregar de forma incondicional un carácter así, si el archivo no lo tiene.

Lo que realmente cuenta es lo que diga el comando hexdump (u otros programas de volcado hexadecimal). Ni siquiera vale el comando vim -b.

Tienes que repasar el significado de los caracteres de fin de línea, pues suele indicar de dónde viene (de qué sistema operativo ha salido ese archivo).

Para quitar esos caracteres, hay que usar siempre chomp(). Solo habría que usar una expresión regular en caso de que estemos procesando un archivo que ha sido creado en un sistema operativo y se va a procesar en otro, en cuyo caso los caracteres de nueva línea son distintos entre sí (chomp() en un sistema no identificará los caracteres en el archivo creado en el otro).

También podemos usar la expresión regular

$texto =~ s/[\r\n]+//g;

que lo que hace es eliminar cualquier presencia de los caracteres Avance de línea y Retorno de carro.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14488
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron