Existe uma maneira de identificar rapidamente arquivos com terminação de linha do Windows ou Unix?

8

Eu sei que podemos usar o dos2unix para converter entre o Windows e o encerramento da linha Unix. Gostaria de saber se existe algum comando que possa me dizer se um arquivo tem terminação de linha do Windows ou Unix?

Oliver
fonte

Respostas:

11
$ file f1 f2 f3
f1: ASCII text, with CRLF, LF line terminators
f2: ASCII text, with CRLF line terminators
f3: ASCII text

Se você achar necessário verificar todas as linhas do arquivo, faça o seguinte:

$ grep -c "^M" f1 f2
f1:0
f2:3

$ wc -l f1 f2
 3 f1
 3 f2
 6 total

O "^ M" foi inserido usando Ctrl + V Ctrl + M e é o caractere ASCII de retorno de carro (CR).

Aqui vemos que o arquivo f1 tem três linhas, mas não há CRs; portanto, todas as terminações de linha devem ser LFs individuais no estilo Unix.

O arquivo f2 possui um número igual de linhas e CRs; portanto, é razoável supor que ele use as terminações de linha CR e LF usadas pelo MSDOS e Windows.

RedGrittyBrick
fonte
1
filenão gera status de final de linha se puder encontrar uma correspondência mais próxima que ASCII, ou seja setup.py: a python script text executable. A não parece encontrar uma bandeira para mudar esse comportamento.
miracle2k
1
@ miracle2k: Talvez um arquivo mágico personalizado possa ser criado para fazer isso. file -m magicfile f1 f2 f3
RedGrittyBrick
1

No Windows, uma maneira rápida de saber é abrir seu arquivo no Bloco de Notas. O bloco de notas mostrará quebras de linha apenas nas terminações no estilo do Windows (CR + LF) e não nas terminações unix (LF). Portanto, seu texto unix ficará assim:

Line1Line2Line3Line4

enquanto que o texto do Windows ficará assim:

line1
line2
line3
line4

Não estou muito familiarizado com a plataforma unix / linux, mas tenho certeza de que você pode usar hacks semelhantes em programas como gedit ou emacs.

Prahlad Yeri
fonte
0
c=($(perl -0777ne 'print $_ =~ tr/\n//; print " "; 
                   print $_ =~ tr/\r//;'))
if   ((!(c[0] +   c[1]))) ;then echo no line endings  
elif ((  c[0] && !c[1] )) ;then echo LF
elif (( !c[0] &&  c[1] )) ;then echo CR 
elif ((  c[0] ==  c[1] )) ;then echo CRLF 
else echo "anbigious LF ${c[0]} CR ${c[1]}"
fi

Note, que por causa da velocidade, apenas individuais \rs e \ns são contados, mas seria um arquivo muito whacky que teve um número igual de ambos os tipos, e ainda não era um arquivo do Windows CRLF ...

Observe também que a ferramenta * nix filenão faz uma verificação completa do arquivo, enquanto esse perlscript faz. Você não mencionou em qual plataforma deseja rodar; Eu usei o bashscript para testar a saída do perl, mas isso pode ser alterado para o cmdscript do Windows .

Você pode apenas canalizar seu arquivo para ele.

Peter.O
fonte