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 (
CRLF
oLF
). ¿Cómo lo descubro?
linux
bash
command-line
newline
line-endings
Marco Ceppi
fuente
fuente
man less
.Respuestas:
Puede usar la
file
utilidad 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
tofrodos
paquete consudo apt-get install tofrodos
, tal como tendría que ejecutarsudo apt-get install dos2unix
para obtenerdos2unix
yunix2dos
.dos2unix
falla? El OP en esa pregunta solo describe vagamente el problema.En
vi
...:set list
para ver los finales de línea.:set nolist
para volver a la normalidadSi bien no creo que pueda ver
\n
ni\r\n
dentrovi
, puede ver qué tipo de archivo es (UNIX, DOS, etc.) para inferir qué terminaciones de línea tiene ...:set ff
Alternativamente, desde
bash
puede usarod -t c <filename>
o simplementeod -c <filename>
para mostrar las devoluciones.fuente
:set fileformat
informará en cuálunix
odos
vim 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 (
\n
o LF) como$
y los finales de línea de Windows (\r\n
o CRLF) como^M$
.fuente
.txt
archivo)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 -v
visualiza\r
caracteres (CR). como^M
. Por lo tanto, las\r\n
secuencias de final de línea se mostrarán como^M
al final de cada línea de salida.cat -e
visualizará adicionalmente\n
, es decir, como$
. (cat -et
también visualizará caracteres de tabulación. como^I
.)fuente
echo -e 'abc\ndef\r\n' | cat -v
y deberías ver un^M
después de "def".Para mostrar CR como
^M
de menor usoless -u
o escriba -uuna vez menos está abierto.man less
dice:fuente
Intenta
file
entoncesfile -k
entoncesdos2unix -ih
file
Por lo general, será suficiente. Pero para casos difíciles intentefile -k
odosunix -ih
.Detalles abajo.
Tratar
file -k
Versión corta:
file -k somefile.txt
te lo diré.with CRLF line endings
para las terminaciones de línea de DOS / Windows.with LF line endings
para las terminaciones de línea MAC.text
. (Entonces, si no menciona explícitamente ningún tipo deline endings
esto, 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
file
es 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
dos2unix
con el--info
interruptor 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-k
para abreviar) enfile
:¡Excelente! Ahora sabemos que nuestro archivo impar tiene
CRLF
terminaciones de línea DOS ( ). (Y los otros archivos tienenLF
terminaciones de línea Unix ( ). Esto no es explícito en esta salida. Es implícito. Es justo como sefile
espera 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 -ih
No 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 file
man dos2unix
fuente
Accounts.java: Java source, ASCII text\012-
en Windows en MinTTYfile -k Accounts.java
dentro del mintty que viene con git-for-windows también, pero mi versión esgit version 2.21.0.windows.1
cat -e file_to_test
Puede usar
xxd
para 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 filename
para convertir a finales de DOS yfromdos filename
para convertir a finales de línea UNIX. Para instalar el paquete en Ubuntu, escribasudo apt-get install tofrodos
.fuente
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 las terminaciones de línea CRLF de Windows. Por LF quiero decir\n
y 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 lafileformats
configuració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
^M
Si 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
\n
como carácter de nueva línea, un archivo de Windows con un carácter de nueva línea de\r\n
todavía se representará correctamente (gracias a\n
) pero tendrá^M
al final del archivo (que es cómo vim representa el\r
carácter).Vim: a veces muestra nuevas líneas de Windows
Si prefiere configurarlo por archivo, puede usarlo
:e ++ff=unix
al editar un archivo determinado.Vim: siempre muestra el tipo de archivo (
unix
vsdos
)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
statusline
conset 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 (
unix
vsdos
)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áunix
para archivos Unix ydos
para Windows.fuente