it-swarm-es.com

¿Cómo averiguar los finales de línea en un archivo de texto?

Estoy tratando de usar algo en bash para mostrarme los finales de línea en un archivo impreso en lugar de interpretado. El archivo es un volcado de SSIS/SQL Server que está siendo leído por una máquina Linux para su procesamiento.

  • ¿Hay algún interruptor dentro de vi, less, more, etc.?

  • Además de ver los finales de línea, necesito saber qué tipo de final de línea es (CRLF o LF). ¿Cómo puedo averiguar eso?

236
Marco Ceppi

Puede usar la utilidad file para darle una indicación del tipo de final 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 el formato primero), aunque siempre se aplican las exenciones de responsabilidad habituales.

337
Dennis Williamson

En vi...

:set list para ver los finales de línea.

:set nolist para volver a la normalidad.

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

:set ff

Alternativamente, desde bash puede usar od -t c <filename> o simplemente od -c <filename> para mostrar las declaraciones.

120
Ryan Berger

En el shell bash, intente cat -v <filename>. Esto debería mostrar los retornos de carro para los archivos de Windows.

(Esto me funcionó 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 de final de línea se mostrarán como ^M al final de cada línea de salida. cat -e además visualizará \n, es decir, como $. (cat -et además visualizará los caracteres de tabulación. como ^I.)

93
warriorpostman

Ubuntu 14.04:

simple cat -e <filename> funciona bien.

Esto muestra los finales de línea Unix (\n o LF) como $ y los finales de línea de Windows (\r\n o CRLF) como ^M$.

84
Alexander Shelemin

Para mostrar CR como ^M en menos uso less -u o escriba -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.
13
P. Kucerak

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

Puedes usar cat -v <filename> como sugiere @warriorpostman.

9
Rich

Prueba "file -k"

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

El problema con la file regular es la siguiente: a veces se trata de 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: este es el aspecto de uno de mis directorios típicos de "trabajo certificado".)

Probemos 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 la 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 interruptor --info de esta manera:

$ 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

Así que eso te dice que: yup, "0.example.end.cer" debe ser el hombre extraño. Pero, ¿qué tipo de finales de línea hay? ¿Sabe de memoria el formato de salida de dos2unix? (Yo no.)

Pero, afortunadamente, existe la opción --keep-going (o -k para abreviar) en 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 finales de línea DOS (CRLF). (Y los otros archivos tienen finales de línea Unix (LF). Esto no está explícito en esta salida. Está implícito. Es solo la forma en que file espera que sea un archivo de texto "normal")

(Si quieres compartir mi mnemotécnico: "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 certificados tienen terminaciones de línea Unix.

Otras lecturas

7
StackzOfZtuff

Puede usar vim -b filename para editar un archivo en modo binario, que mostrará ^ M caracteres para el retorno de carro y una nueva línea es indicativa de que LF está presente, lo que indica los finales de línea CRLF de Windows. Por LF Me refiero a \n y por CR me refiero a \r. Tenga en cuenta que cuando use la opción -b, el archivo siempre se editará en el modo UNIX de manera predeterminada, como lo indica [unix] en la línea de estado, lo que significa que si agrega nuevas líneas, finalizarán con LF, no CRLF. Si usa vim normal sin -b en un archivo con finales de línea CRLF, debería ver [dos] que se muestra 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 explica las complejidades.

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

4
smalers

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

4
Zorayr

Vuelvo mi salida a un archivo de texto. Luego lo abro en notepad ++ luego hago clic en el botón Mostrar todos los caracteres. No muy elegante pero funciona.

0
Diego