martes, 25 de enero de 2011

Tip: Como remover los molestos ^M

En ocasiones ya sea porque hemos editado un archivo en windows o porque algún colega nos ha pasado ún código al tratar de ejecutarlo nos regresa el siguiente error:
Es más al revisar el archivo con vi nos encontramos con algo como esto:

Como podemos ver cada línea tiene un caracter ^M al final, lo que hace que el shell no pueda determinar correctamente el final de cada linea. Esto es debido a que Unix usa como separador de linea LF(\n) mientras que Windows/DOS usa CR/LF(\r\n). Por tanto basta con eliminar los caracteres extras de nuestro archivo,  aunque hay una herramienta de nombre dos2unix, esta no esta presente de forma estándar. Por lo que nos abocaremos a hacer una subrutina que cumpla esta misma función.
La parte funcional la implementaremos usando el programa tr de la siguiente forma:
tr -d '\r' < archivo_a_limpiar > archivo_limpio
Ahora bien una función en el interprete de comandos se puede implementar de la siguiente forma:
Nombre_Funcion()
{
     Comando_1
      Comando_2
       ...
      Comando_N

}

Llamaremos a nuestra funcion strip_cr, para que la misma pueda procesar un archivo sobre demanda, debemos especificarlo mediante un parametro. Los parámetros en una función shell se especifican como $1,$2,... $9 para el primero, el segundo y hasta el noveno parametro.
Por tanto la entrada de nuestro comando tr sería de la siguiente forma:
tr -d '\r' < $1
La salida del comando no puede ser el mismo archivo de entrada, por lo que ocupamos la variable especial $$ que almacena nuestro id de proceso. Así:
tr -d '\r' < $1 > $1.$$
Sin embargo tendríamos que consultar siempre cual es el archivo mas reciente, que se llame igual que el original mas un "." (mucho lío ¿no les parece?). En lugar de eso después de obtener la salida sustituimos el original con el nuevo archivo:
tr -d '\r' < $1 > $1.$$
mv $1.$$ $1
Al final nuestra subrutina quedaría así:
strip_cr()
{
  tr -d '\r' < $1 > $1.$$
  mv $1.$$ $1
}

y al ejecutarla el resultado seria el siguiente:

Que como podemos ver carece ya de los caracteres ^M que se visualizaban antes.

0 comentarios:

Publicar un comentario