Estou tentando usar algo no bash para me mostrar as terminações de linha em um arquivo impresso em vez de interpretado. O arquivo é um despejo do SSIS / SQL Server sendo lido por uma máquina Linux para processamento.
Há algum interruptores dentro
vi
,less
,more
, etc?Além de ver os finais de linha, preciso saber que tipo de final de linha é (
CRLF
ouLF
). Como faço para descobrir isso?
linux
bash
command-line
newline
line-endings
Marco Ceppi
fonte
fonte
man less
,.Respostas:
Você pode usar o
file
utilitário para fornecer uma indicação do tipo de final de linha.Unix:
"DOS":
Para converter de "DOS" para Unix:
Para converter de Unix para "DOS":
A conversão de um arquivo já convertido não tem efeito, portanto é seguro executar cegamente (ou seja, sem testar o formato primeiro), embora as isenções de responsabilidade usuais se apliquem, como sempre.
fonte
tofrodos
pacotesudo apt-get install tofrodos
- assim como você precisaria executarsudo apt-get install dos2unix
para obterdos2unix
eunix2dos
.dos2unix
falha em? O PO dessa pergunta apenas descreve vagamente a questão.Em
vi
...:set list
para ver finais de linha.:set nolist
para voltar ao normal.Enquanto eu não acho que você pode ver
\n
ou\r\n
novi
, você pode ver que tipo de arquivo é (UNIX, DOS, etc.) para inferir que as terminações de linha que tem ...:set ff
Como alternativa,
bash
você pode usarod -t c <filename>
ou apenasod -c <filename>
para exibir os retornos.fonte
:set fileformat
informará em qualunix
ou odos
vim acha que estão as terminações de linha do arquivo. Você pode alterá-lo:set fileformat=unix
.od -t c file/path
, mas obrigado pelo novo programa. Trabalhou muito bem!Ubuntu 14.04:
cat -e <filename>
Trabalhos simples muito bem.Isso exibe finais de linha Unix (
\n
ou LF) como$
e finais de linha do Windows (\r\n
ou CRLF) como^M$
.fonte
.txt
arquivo)No shell bash, tente
cat -v <filename>
. Isso deve exibir retornos de carro para arquivos do Windows.(Isso funcionou para mim no rxvt via Cygwin no Windows XP).
Nota do editor:
cat -v
visualiza\r
caracteres (CR). como^M
. Assim, as\r\n
seqüências de final de linha serão exibidas^M
no final de cada linha de saída.cat -e
irá visualizar adicionalmente\n
, nomeadamente como$
. (cat -et
visualiza adicionalmente os caracteres das guias. como^I
.)fonte
echo -e 'abc\ndef\r\n' | cat -v
e você deve ver um^M
após o "def".Para mostrar CR como
^M
menos usoless -u
ou digitar -umenos uma vez, está aberto.man less
diz:fonte
Tente
file
entãofile -k
entãodos2unix -ih
file
normalmente será suficiente. Mas, para casos difíceis, tentefile -k
oudosunix -ih
.Detalhes abaixo.
Experimentar
file -k
Versão curta:
file -k somefile.txt
vou te dizer.with CRLF line endings
para terminações de linha do DOS / Windows.with LF line endings
para terminações de linha MAC.text
. (Portanto, se ele não mencionar explicitamente nenhum tipoline endings
, isso significa implicitamente: "finais de linha CR" .)Versão longa, veja abaixo.
Exemplo do mundo real: codificação de certificado
Às vezes, tenho que verificar isso em busca de arquivos de certificado PEM.
O problema com o regular
file
é o seguinte: às vezes, ele tenta ser muito inteligente / muito específico.Vamos tentar um pequeno teste: eu tenho alguns arquivos. E um desses arquivos possui finais de linha diferentes. Qual?
(A propósito: é assim que um dos meus diretórios típicos de "trabalho de certificado" se parece.)
Vamos tentar regularmente
file
:Hã. Não está me dizendo os finais da linha. E eu já sabia que eram arquivos cert. Eu não precisava de "arquivo" para me dizer isso.
O que mais você pode tentar?
Você pode tentar
dos2unix
com a--info
opção assim:Então isso diz a você que: sim, "0.example.end.cer" deve ser o homem estranho. Mas que tipo de finais de linha existem? Do que você sabe o formato de saída dos2unix de cor? (Eu não.)
Mas, felizmente, existe a opção
--keep-going
(ou-k
abreviada) emfile
:Excelente! Agora sabemos que nosso arquivo ímpar possui
CRLF
terminações de linha DOS ( ). (E os outros arquivos têmLF
finais de linha Unix ( ). Isso não está explícito nesta saída. Está implícito. É exatamente assim que sefile
espera que um arquivo de texto "regular" seja.)(Se você quiser compartilhar meu mnemônico: "L" é para "Linux" e "LF".)
Agora vamos converter o culpado e tentar novamente:
Boa. Agora todos os certificados têm finais de linha Unix.
Experimentar
dos2unix -ih
Eu não sabia disso quando estava escrevendo o exemplo acima, mas:
Na verdade, acontece que o dos2unix fornecerá uma linha de cabeçalho se você usar
-ih
(abreviação de--info=h
) assim:E outro momento "realmente": o formato do cabeçalho é realmente fácil de lembrar: Aqui estão duas mnemônicas:
Leitura adicional
man file
man dos2unix
fonte
Accounts.java: Java source, ASCII text\012-
no Windows no MinTTYfile -k Accounts.java
dentro do mintty que vem com o git-for-windows também, mas minha versão égit version 2.21.0.windows.1
cat -e file_to_test
Você pode usar
xxd
para mostrar um despejo hexadecimal do arquivo e procurar caracteres "0d0a" ou "0a".Você pode usar
cat -v <filename>
como @warriorpostman sugere.fonte
Você pode usar o comando
todos filename
para converter em finais do DOS efromdos filename
em finais da linha UNIX. Para instalar o pacote no Ubuntu, digitesudo apt-get install tofrodos
.fonte
Você pode usar
vim -b filename
para editar um arquivo no modo binário, que mostrará ^ M caracteres para retorno de carro e uma nova linha indicará a presença de LF, indicando as terminações da linha CRLF do Windows. Por LF eu quero dizer\n
e por CR eu quero dizer\r
. Observe que, quando você usa a opção -b, o arquivo sempre será editado no modo UNIX por padrão, conforme indicado[unix]
na linha de status, o que significa que, se você adicionar novas linhas, elas terminarão com LF, não com CRLF. Se você usar o vim normal sem -b em um arquivo com terminações de linhas CRLF, deverá ver[dos]
a linha de status e as linhas inseridas terão CRLF como final de linha. A documentação do vim parafileformats
configuração explica as complexidades.Além disso, não tenho pontos suficientes para comentar a resposta do Notepad ++, mas se você usar o Notepad ++ no Windows, use o menu Exibir / Mostrar símbolo / Mostrar fim da linha para exibir CR e LF. Neste caso, LF é mostrado, enquanto que para vim o LF é indicado por uma nova linha.
fonte
Eu despejo minha saída em um arquivo de texto. Em seguida, abro-o no bloco de notas ++ e clico no botão Mostrar todos os caracteres. Não é muito elegante, mas funciona.
fonte
Vim - sempre mostre as novas linhas do Windows como
^M
Se você preferir sempre ver as novas linhas do Windows no vim render as
^M
, você pode adicionar esta linha ao seu.vimrc
:Isso fará com que o vim interprete todos os arquivos que você abrir como um arquivo unix. Como os arquivos unix têm
\n
como caractere de nova linha, um arquivo do Windows com um caractere de nova linha\r\n
ainda será renderizado corretamente (graças ao\n
), mas terá^M
no final do arquivo (que é como o vim renderiza o\r
caractere).Vim - às vezes mostra novas linhas do Windows
Se você preferir defini-lo por arquivo, use-o
:e ++ff=unix
ao editar um determinado arquivo.Vim - sempre mostra o tipo de arquivo (
unix
vsdos
)Se você quer a linha de fundo do vim para exibir sempre o que você está editando filetype (e você não forçou definir o tipo de arquivo para unix), você pode adicionar à sua
statusline
comset statusline+=\ %{&fileencoding?&fileencoding:&encoding}
.Minha linha de status completa é fornecida abaixo. Basta adicioná-lo ao seu
.vimrc
.Vai render como
na parte inferior do seu arquivo
Vim - às vezes mostra o tipo de arquivo (
unix
vsdos
)Se você quiser apenas ver que tipo de arquivo possui, poderá usar
:set fileformat
(isso não funcionará se você forçar a definição do tipo de arquivo). Ele retornaráunix
para arquivos unix edos
para Windows.fonte