¿Cómo encontrar terminaciones de línea en un archivo de texto?

Estoy tratando de usar algo en bash para mostrarme las terminaciones de línea en un archivo impreso en lugar de interpretarlo. El archivo es un volcado de SSIS / SQL Server que se lee en una máquina Linux para su procesamiento.

    Puede usar la utilidad de file para darle una indicación del tipo de terminaciones de línea.

    Unix:

     $ file testfile1.txt testfile.txt: ASCII text 

    “DOS”:

     $ file testfile2.txt testfile2.txt: ASCII text, with CRLF line terminators 

    Para convertir de “DOS” a Unix:

     $ dos2unix testfile2.txt 

    Para convertir de Unix a “DOS”:

     $ unix2dos testfile1.txt 

    La conversión de un archivo ya convertido no tiene ningún efecto por lo que es seguro ejecutarlo a ciegas (es decir, sin probar primero el formato), aunque se aplican los descargos de responsabilidad habituales, como siempre.

    En vi

    :set list para ver finales de línea.

    :set nolist para volver a la normalidad.

    Aunque no creo que pueda ver \n o \r\n en vi , puede ver qué tipo de archivo es (UNIX, DOS, etc.) para inferir qué terminaciones de línea tiene …

    :set ff

    Alternativamente, desde bash puede usar od -tc o solo od -c para visualizar los retornos.

    En el shell bash, prueba cat -v . Esto debería mostrar retornos de carro para archivos de Windows.

    (Esto funcionó para mí en rxvt a través de Cygwin en Windows XP).

    Nota del editor: cat -v visualiza los caracteres \r (CR). como ^M Por lo tanto, las secuencias \r\n final de línea se mostrarán como ^M al final de cada línea de salida. cat -e también visualizará \n , a saber, como $ . ( cat -et además visualizará los caracteres de tabulación como ^I ).

    Ubuntu 14.04:

    simple cat -e funciona bien.

    Muestra las terminaciones de línea de Unix ( \n o LF) como terminaciones de línea $ y Windows ( \r\n o CRLF) como ^M$ .

    Para mostrar CR como ^M en menos uso less -u o tipo - u una vez menos está abierto.

    man less dice:

     -u or --underline-special Causes backspaces and carriage returns to be treated as print- able characters; that is, they are sent to the terminal when they appear in the input. 

    Puede usar xxd para mostrar un volcado hexadecimal del archivo y buscar caracteres “0d0a” o “0a”.

    Puedes usar cat -v como @warriorpostman sugiere.

    Puede usar el comando todos filename para convertir a terminaciones de DOS y fromdos filename para convertir a terminaciones de línea UNIX. Para instalar el paquete en Ubuntu, escriba sudo apt-get install tofrodos .

    Puede usar vim -b filename de vim -b filename para editar un archivo en modo binario, que mostrará ^ M caracteres para retorno de carro y una nueva línea indica que LF está presente, lo que indica terminaciones de línea CRLF de Windows. Por LF quiero decir \n y por CR quiero decir \r . Tenga en cuenta que cuando utiliza la opción -b, el archivo siempre se editará en modo UNIX de manera predeterminada, tal como lo indica [unix] en la línea de estado, lo que significa que si agrega líneas nuevas terminarán con LF, no con CRLF. Si usa vim normal sin -b en un archivo con terminaciones de línea CRLF, debería ver [dos] en la línea de estado y las líneas insertadas tendrán CRLF como final de línea. La documentación de vim para la configuración de fileformats de fileformats explica las complejidades.

    Además, no tengo suficientes puntos para comentar en la respuesta de Notepad ++, pero si usa Notepad ++ en Windows, use el menú Ver / Mostrar símbolo / Mostrar fin de línea para mostrar CR y LF. En este caso, se muestra LF, mientras que para vim, el LF se indica con una nueva línea.

    Pruebe con “archivo -k”

    A veces tengo que verificar esto para encontrar los archivos del certificado PEM.

    El problema con el file regular es este: a veces intenta ser demasiado inteligente / demasiado específico.

    Probemos un pequeño cuestionario: tengo algunos archivos. Y uno de estos archivos tiene diferentes finales de línea. ¿Cúal?

    (Por cierto: esto es lo que parece uno de mis directorios típicos de “trabajo certificado”).

    Probemos el file regular:

     $ file -- * 0.example.end.cer: PEM certificate 0.example.end.key: PEM RSA private key 1.example.int.cer: PEM certificate 2.example.root.cer: PEM certificate example.opensslconfig.ini: ASCII text example.req: PEM certificate request 

    Huh. No me está diciendo los finales de línea. Y ya sabía que esos eran archivos cert. No necesitaba “archivo” para decirme eso.

    ¿Qué más puedes probar?

    Puede probar dos2unix con el --info como este:

     $ dos2unix --info -- * 37 0 0 no_bom text 0.example.end.cer 0 27 0 no_bom text 0.example.end.key 0 28 0 no_bom text 1.example.int.cer 0 25 0 no_bom text 2.example.root.cer 0 35 0 no_bom text example.opensslconfig.ini 0 19 0 no_bom text example.req 

    Entonces eso te dice que: yup, “0.example.end.cer” debe ser el hombre impar. Pero, ¿qué tipo de finales de línea hay? ¿Conoces el formato de salida dos2unix de memoria? (Yo no.)

    Pero, afortunadamente, está la --keep-going (o -k for short) en el file :

     $ file --keep-going -- * 0.example.end.cer: PEM certificate\012- , ASCII text, with CRLF line terminators\012- data 0.example.end.key: PEM RSA private key\012- , ASCII text\012- data 1.example.int.cer: PEM certificate\012- , ASCII text\012- data 2.example.root.cer: PEM certificate\012- , ASCII text\012- data example.opensslconfig.ini: ASCII text\012- data example.req: PEM certificate request\012- , ASCII text\012- data 

    ¡Excelente! Ahora sabemos que nuestro archivo impar tiene terminaciones de línea DOS ( CRLF ). (Y los otros archivos tienen terminaciones de línea Unix ( LF ). Esto no está explícito en esta salida. Está implícito. Es la forma en que el file espera que sea un archivo de texto “normal”).

    (Si quieres compartir mi mnemónico: “L” es para “Linux” y para “LF”).

    Ahora convirtamos al culpable e intentemos de nuevo:

     $ dos2unix -- 0.example.end.cer $ file --keep-going -- * 0.example.end.cer: PEM certificate\012- , ASCII text\012- data 0.example.end.key: PEM RSA private key\012- , ASCII text\012- data 1.example.int.cer: PEM certificate\012- , ASCII text\012- data 2.example.root.cer: PEM certificate\012- , ASCII text\012- data example.opensslconfig.ini: ASCII text\012- data example.req: PEM certificate request\012- , ASCII text\012- data 

    Bueno. Ahora todos los certs tienen terminaciones de línea Unix.

    Otras lecturas

    • man file
    • man dos2unix
    • Wikipedia: Newline

    Suelto mi salida a un archivo de texto. Luego lo abro en el bloc de notas ++ y luego hago clic en el botón Mostrar todos los personajes. No es muy elegante, pero funciona.