A veces nos encontramos errores técnicos en aplicaciones, scripts, etc. y los resolvemos pero no guardamos en ningún lado la solución y los síntomas. Quise hacer una especie de repositorio de problemas/soluciones, y tener disponibles mis experiencias para todos. Espero no volver a decir "¡esto ya me había pasado, pero no me acuerdo cómo lo resolví!" [temas: Oracle DB, korn shell scripts, Oracle App Server, Oracle Collaboration Suite, Windows, Linux, ...]

miércoles, agosto 06, 2008

los fastidiosos caracteres "^M" al final de cada línea de texto

Cuando se generan archivos de texto en windows (en el Notepad, por ejemplo) y se copian a unix para trabajar con ellos, resulta que "aparecen" algunos caracteres "raros" al final de cada línea, que a veces se ven como la combinación de los caracteres: ^M. Esto se debe a que el formato que maneja windows para un fin de línea lleva dos caracteres: "new line" y "carriage return" (\n\r), mientras que en unix sólo se usa el de "new line" (\n). (En Mac se usa sólo "carriage return" (\r))

A mí me sucedió que me pasaron un archivo con una lista de números que yo tenía que comparar con otra lista y hacer algunas operaciones más, y al hacer la comparación con el comando diff, no obtuve los resultados esperados, y al guardar el resultado de la salida del diff, me di cuenta de que aparecían los dichosos caracteres ^M, y por eso todas las líneas entre ambos archivos eran distintas.

Entonces encontré la manera de convertir el archivo que provenía de windows para quitarle esos caracteres, con el comando siguiente:

tr -d '\015' <> unix-format.txt

También es posible hacer la operación inversa, cuando se quiere llevar un archivo de unix a windows:
sed -e 's/$/\r/' unix-format.txt > win-format.txt
Después encontré otro blog interesante al respecto. Transcribo (copy-paste) aquí el contenido y luego incluyo el URL:

If the ^M character is showing up in files while opening the file concerned, then follow these steps to convert it to a new line.
In vi use the following:

:%s/^M/\n/g

or with perl on the command line:

$ perl -pi.bak -e ’s/^M/\n/g’

NOTE: Be sure to create the ^M by typing ctrl V followed by ctrl M.

^M is ASCII 13 (Ctrl M), which is the carriage return.

Different operating systems use different symbols to set the end of a line/new line.
Unix uses newline (\n)
Mac uses carriage return (\r)
And Windows/DOS use both (\n\r)

To prevent the ^M from showing up in files, be sure to use the ASCII (text) mode when transfering text files.

http://blog.eukhost.com/webhosting/convert-m-to-newline-character-in-text-files/


Ahi quedó.