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 interruptores dentro
vi,less,more, etc?Además de ver los finales de línea, necesito saber qué tipo de final de línea es (
CRLFoLF). ¿Cómo lo descubro?
linux
bash
command-line
newline
line-endings
Marco Ceppi
fuente
fuente

man less.Respuestas:
Puede usar la
fileutilidad para darle una indicación del tipo de terminaciones de línea.Unix:
"DOS":
Para convertir de "DOS" a Unix:
Para convertir de Unix a "DOS":
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 las exenciones de responsabilidad habituales, como siempre.
fuente
tofrodospaquete consudo apt-get install tofrodos, tal como tendría que ejecutarsudo apt-get install dos2unixpara obtenerdos2unixyunix2dos.dos2unixfalla? El OP en esa pregunta solo describe vagamente el problema.En
vi...:set listpara ver los finales de línea.:set nolistpara volver a la normalidadSi bien no creo que pueda ver
\nni\r\ndentrovi, puede ver qué tipo de archivo es (UNIX, DOS, etc.) para inferir qué terminaciones de línea tiene ...:set ffAlternativamente, desde
bashpuede usarod -t c <filename>o simplementeod -c <filename>para mostrar las devoluciones.fuente
:set fileformatinformará en cuálunixodosvim cree que están las terminaciones de línea del archivo. Puede cambiarlo por:set fileformat=unix.od -t c file/path, pero gracias por el nuevo programa. Funcionó genial!Ubuntu 14.04:
simple
cat -e <filename>funciona bien.Esto muestra los finales de línea de Unix (
\no LF) como$y los finales de línea de Windows (\r\no CRLF) como^M$.fuente
.txtarchivo)En el shell bash, inténtalo
cat -v <filename>. 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 -vvisualiza\rcaracteres (CR). como^M. Por lo tanto, las\r\nsecuencias de final de línea se mostrarán como^Mal final de cada línea de salida.cat -evisualizará adicionalmente\n, es decir, como$. (cat -ettambién visualizará caracteres de tabulación. como^I.)fuente
echo -e 'abc\ndef\r\n' | cat -vy deberías ver un^Mdespués de "def".Para mostrar CR como
^Mde menor usoless -uo escriba -uuna vez menos está abierto.man lessdice:fuente
Intenta
fileentoncesfile -kentoncesdos2unix -ihfilePor lo general, será suficiente. Pero para casos difíciles intentefile -kodosunix -ih.Detalles abajo.
Tratar
file -kVersión corta:
file -k somefile.txtte lo diré.with CRLF line endingspara las terminaciones de línea de DOS / Windows.with LF line endingspara las terminaciones de línea MAC.text. (Entonces, si no menciona explícitamente ningún tipo deline endingsesto, esto significa implícitamente: "terminaciones de línea CR" ).Versión larga ver abajo.
Ejemplo del mundo real: codificación de certificados
A veces tengo que verificar esto para archivos de certificado PEM.
El problema con regular
filees este: a veces está tratando 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: así es como se ve uno de mis directorios típicos de "trabajo de certificado").
Probemos con regularidad
file:Huh No me dice 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 intentar
dos2unixcon el--infointerruptor de esta manera:Eso te dice que: sí, "0.example.end.cer" debe ser el hombre extraño. Pero, ¿qué tipo de terminaciones de línea hay? Qué se conoce el formato de salida dos2unix de memoria? (Yo no.)
Pero afortunadamente existe la opción
--keep-going(o-kpara abreviar) enfile:¡Excelente! Ahora sabemos que nuestro archivo impar tiene
CRLFterminaciones de línea DOS ( ). (Y los otros archivos tienenLFterminaciones de línea Unix ( ). Esto no es explícito en esta salida. Es implícito. Es justo como sefileespera que sea un archivo de texto "normal").(Si quieres compartir mi mnemotécnico: "L" es para "Linux" y para "LF").
Ahora convierta al culpable e intente nuevamente:
Bueno. Ahora todos los certs tienen terminaciones de línea Unix.
Tratar
dos2unix -ihNo sabía esto cuando estaba escribiendo el ejemplo anterior, pero:
En realidad, resulta que dos2unix le dará una línea de encabezado si usa
-ih(abreviatura de--info=h) así:Y otro momento "en realidad": el formato del encabezado es realmente fácil de recordar: aquí hay dos mnemotécnicos:
Otras lecturas
man fileman dos2unixfuente
Accounts.java: Java source, ASCII text\012-en Windows en MinTTYfile -k Accounts.javadentro del mintty que viene con git-for-windows también, pero mi versión esgit version 2.21.0.windows.1cat -e file_to_testPuede usar
xxdpara mostrar un volcado hexadecimal del archivo y buscar caracteres "0d0a" o "0a".Puedes usar
cat -v <filename>como sugiere @warriorpostman.fuente
Puede usar el comando
todos filenamepara convertir a finales de DOS yfromdos filenamepara convertir a finales de línea UNIX. Para instalar el paquete en Ubuntu, escribasudo apt-get install tofrodos.fuente
Puede usar
vim -b filenamepara 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 las terminaciones de línea CRLF de Windows. Por LF quiero decir\ny por CR quiero decir\r. Tenga en cuenta que cuando usa la opción -b, el archivo siempre se editará en modo UNIX de manera predeterminada, como se indica[unix]en la línea de estado, lo que significa que si agrega nuevas líneas terminarán con LF, no CRLF. Si usa vim normal sin -b en un archivo con terminaciones de línea CRLF, debería ver que se[dos]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 lafileformatsconfiguración 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 mediante una nueva línea.
fuente
Volcado mi salida a un archivo de texto. Luego lo abro en notepad ++ y luego hago clic en el botón mostrar todos los caracteres. No es muy elegante pero funciona.
fuente
Vim: siempre muestra las nuevas líneas de Windows como
^MSi prefiere ver siempre las nuevas líneas de Windows en vim render as
^M, puede agregar esta línea a su.vimrc:Esto hará que vim interprete cada archivo que abra como un archivo Unix. Dado que los archivos Unix tienen
\ncomo carácter de nueva línea, un archivo de Windows con un carácter de nueva línea de\r\ntodavía se representará correctamente (gracias a\n) pero tendrá^Mal final del archivo (que es cómo vim representa el\rcarácter).Vim: a veces muestra nuevas líneas de Windows
Si prefiere configurarlo por archivo, puede usarlo
:e ++ff=unixal editar un archivo determinado.Vim: siempre muestra el tipo de archivo (
unixvsdos)Si desea que la línea inferior de vim muestre siempre qué tipo de archivo está editando (y no forzó a establecer el tipo de archivo en unix), puede agregarlo a su
statuslineconset statusline+=\ %{&fileencoding?&fileencoding:&encoding}.Mi línea de estado completa se proporciona a continuación. Solo agrégalo a tu
.vimrc.Se renderizará como
al final de tu archivo
Vim: a veces muestra el tipo de archivo (
unixvsdos)Si solo quieres ver qué tipo de archivo tienes, puedes usarlo
:set fileformat(esto no funcionará si forzaste a establecer el tipo de archivo). Volveráunixpara archivos Unix ydospara Windows.fuente