Ene 112013
 

Cuando trabajamos en Windows con un fichero de texto que fué generado en un sistema linux, a menudo nos encontramos con el problema de que los saltos de línea no son interpretados correctamente, y lo mismo ocurre a la inversa.

Esto se debe a que la convención utilizada en sistemas linux es representar el salto de linea como un único carácter LF (line feed, 0x0A hexadecimal). Por el contrario, en Windows la convención es utilizar dos caracteres CR+LF (carriage return + line feed, 0x0D+0x0A).

El uso de CRLF para representar el salto de línea es conocido como “formato DOS”, dado que comenzó a utilizarse en los sistemas PC-DOS, MS-DOS y otros relacionados.

Métodos para convertir los saltos de línea entre formato DOS y formato Unix

En un sistema linux, hay muchas maneras de realizar la conversión. Por una parte, están los que se basan en herramientas de propósito general, que están disponibles prácticamente en todos los sistemas:

  • GNU sed (stream editor)
  • Perl
  • FTP

Por otra parte, existen programas especialmente dedicados a realizar esta labor de conversión:

  • todos
  • unix2dos

Realizar la conversión de Unix a DOS usando GNU sed

El comando sed aplica  una lista de comandos de edición que se le pasa como primer argumento a los ficheros especificados en el segundo argumento y siguientes, o bien al texto que lee de standard input en caso de que no se especifiquen ficheros.

Los dos comandos a continuación se pueden utilizar indistintamente para convertir el fichero “entrada.txt”, con saltos de línea en formato unix, en un fichero “salida.txt” con saltos de línea en formato DOS

$ sed 's/$/r/' < entrada.txt > salida.txt
$ sed 's/$/r/' entrada.txt > salida.txt

También podemos utilizar la opción “-i” para convertir el fichero “in place”, con lo que se sustituye el original por el fichero convertido:

$ sed -i 's/$/r/' entrada.txt

Realizar la conversión de Unix a DOS usando Perl

También podemos utilizar un comando perl “one-liner”  para convertir el texto recibido por standard input:

$ perl -pe 's/n/rn/' < entrada.txt > salida.txt

para leer un fichero y convertirlo en otro:

$ perl -pe 's/n/rn/' entrada.txt > salida.txt

e incluso para convertir el fichero “in place”:

$ perl -pi -e 's/n/rn/' entrada.txt

La opción -p indica que se ejecute el script para cada línea leída. La variable especial de perl “$_” contiene la línea antes de ser procesada, y el comando “s/n/rn/” sustituye en dicha variable el carácter ‘n’ (line feed) por los caracteres ‘rn’ (carriage return, linefeed). Por último, el contenido de la variable “$_” se envía a standard output.

La opción “-i”, igual que en el comando “sed”, se utiliza para la edición “in place”.

La opción “-e” especifica el script que debe ser ejecutado.

Utilizando el comando “todos”

El comando todos es parte del paquete tofrodos que se puede instalar en un sistema linux con el comando apt-get o similar:

$ apt-get install tofrodos

Al igual que con los anteriores métodos, se le puede dar un nombre de fichero para que lo convierta, o hacer que convierta lo que lea por standard input:

$ todos entrada.txt
$ todos < entrada.txt > salida.txt

Utilizando el comando unix2dos

El comando unix2dos es parte del paquete dos2unix que se puede instalar en un sistema linux:

El comando unix2dos es parte del paquete dos2unix que se puede instalar en un sistema linux, y se utiliza igual que el comando “todos”:

 $ apt-get install dos2unix
 $ unix2dos < input.txt > output.txt
 $ unix2dos input.txt

 

Cómo comprobar el tipo de salto de línea de un fichero

Podemos utilizar la opción “-e” del comando “cat” para visualizar los saltos de línea. Utilizando esta opción, en la salida generada se representa el carácter CR como “^M”, y el carácter LF como “$”.

Si el fichero “entrada.txt” contiene una línea “hola mundo” en formato unix, y el fichero “salida.txt” contiene la misma línea en formato DOS, el resultado es:

$ cat -e entrada.txt
hola mundo$
$ cat -e salida.txt
hola mundo^M$

 Publicado por en 10:53 am

 Deja un comentario

(requerido)

(requerido)