Códigos de control CRLF / LF / CR
En informática, CRLF se refiere a la combinación de dos códigos de control: CR (retorno de carro) y LF (salto de línea), uno detrás del otro; normalmente con el objetivo de crear una nueva línea.
Hoy en día, los sistemas operativos DOS y Microsoft Windows siguen usando CRLF como marcador de nueva línea, mientras que el resto usan códigos más simples.
Algunos de los primeros protocolos de red, que transmitían principalmente texto, establecieron que el terminador de línea debía ser CRLF y no otro. Son ejemplos HTTP, FTP, IRC, o SMTP, que marca el final del mensaje mediante “CRLF.CRLF”
- CRLF (Windows) = End of Line (EOL) = 0x0D 0x0A = \r\n
- LF (Unix) = 0x0A (10 decimal). = \n = nl
- CR (Macintosh < OS-9) = 0x0D (13 decimal) = \r = cr
Hay que destacar que esto son dos códigos, y los programas que usan CRLF han de tener un comportamiento definido respecto a qué pasa cuando se usa sólo un CR o sólo un LF. Por ejemplo, el protocolo HTTP define que cada línea de la cabecera ha de acabar en CRLF, pero que ni CR ni LF pueden aparecer entre medio cuando se pide una URI.
Dependiendo del editor de texto o utilidad en uso para visualizar un archivo, este puede representarse correctamente o bien con ciertos problemas. Dos de los problemas más comunes es la visualización del texto completo en una sola linea o bien encontrar caracteres extraños al final de las lineas: ^M (suele referenciar “\r”). La solución para por adaptar los códigos de control del fichero acorde al sistema / software en uso.
Códigos de control CRLF / LF / CR y el comando echo.
echo -ne "111 \r\n 222" > fichero file fichero fichero: ASCII text, with CRLF line terminators ## echo -ne "111 \r 222" > fichero file fichero fichero: ASCII text, with CR line terminators ## echo -ne "111 \n 222" > fichero file fichero fichero: ASCII text ## echo -e "111 \r\n 222" > fichero file fichero fichero: ASCII text, with CRLF, LF line terminators # No utilizar "-n" produce que echo escriba una nueva linea (\r = LF) al final. ## echo -e "111 > 222" > fichero file fichero fichero: ASCII text
NOTA: No es lo normal, pero puede encontrarse en un fichero todos los códigos de control.
file fichero. lpi: UTF-8 Unicode text, with very long lines, with CRLF, CR, LF line terminators
od: Herramienta para identificar fácilmente códigos de control (CRLF, CR, LF).
echo -e "111 \r\n 222" > fichero od -c fichero | grep --color=always '\\r\|\\n' 0000000 1 1 1 \r \n 2 2 2 \n echo -ne "111 \r\n 222" > fichero od -c fichero | grep --color=always '\\r\|\\n' 0000000 1 1 1 \r \n 2 2 2
Herramientas que permiten corregir códigos de control.
Comandos dos2unix / unix2dos.
dos2unix archivo.txt unix2dos archivo.txt
Comando sed.
sed $'s/\r$//' # DOS to Unix. sed 's/^M$//' # DOS to Unix. sed $'s/$/\r/' # Unix to DOS. sed 's/$/^M/' # Unix to DOS.
Herramientas tr, dtou, utod, editor vi, etc.
Averiguar representación decimal / hexadecimal / octal de un determinado carácter.
echo -ne "111 \r\n 222" | od -A n -t u1 # Decimal. 49 49 49 32 13 10 32 50 50 50 echo -ne "111 \r\n 222" | od -A n -t x1 # Hexadecimal. 31 31 31 20 0d 0a 20 32 32 32 echo -ne "111 \r\n 222" | od -A n -t o1 # Octal. 061 061 061 040 015 012 040 062 062 062