risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come scoprire le terminazioni di riga in un file di testo?

Sto cercando di usare qualcosa in bash per mostrarmi le terminazioni di linea in un file stampato piuttosto che interpretato. Il file è un dump di SSIS/SQL Server letto da una macchina Linux per l'elaborazione.

  • Ci sono switch all'interno di vi, less, more, etc?

  • Oltre a vedere le terminazioni di riga, ho bisogno di sapere quale tipo di fine linea è (CRLF o LF). Come lo scopro?

240
Marco Ceppi

Puoi usare l'utility file per darti un'indicazione del tipo di fine linea.

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators

Per convertire da "DOS" a Unix:

$ dos2unix testfile2.txt

Per convertire da Unix a "DOS":

$ unix2dos testfile1.txt

La conversione di un file già convertito non ha alcun effetto quindi è sicuro eseguirlo ciecamente (cioè senza testare prima il formato), anche se si applicano le consuete dichiarazioni di non responsabilità, come sempre.

346

In vi...

:set list per vedere le terminazioni di riga.

:set nolist per tornare alla normalità.

Mentre non penso che tu possa vedere \n o \r\n in vi, puoi vedere quale tipo di file è (UNIX, DOS, ecc.) Per dedurre quali terminazioni di linea ha ...

:set ff

In alternativa, da bash puoi usare od -t c <filename> o solo od -c <filename> per visualizzare i ritorni.

120
Ryan Berger

Nella shell di bash, prova cat -v <filename>. Questo dovrebbe visualizzare i ritorni a capo per i file di Windows.

(Questo ha funzionato per me in rxvt tramite Cygwin su Windows XP).

Nota del redattore: cat -v visualizza i caratteri \r (CR). come ^M. Pertanto, le sequenze \r\n di fine riga verranno visualizzate come ^M alla fine di ogni riga di output. cat -e visualizzerà inoltre \n, ovvero come $. (cat -et visualizzerà inoltre i caratteri di tabulazione come ^I.)

96
warriorpostman

Ubuntu 14.04:

semplice cat -e <filename> funziona bene.

Visualizza terminazioni di linea Unix (\n o LF) come $ e terminazioni di riga di Windows (\r\n o CRLF) come ^M$.

86

Per mostrare CR come ^M in meno usa less -u o type -u una volta di meno è aperto.

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

Puoi usare xxd per mostrare un dump esadecimale del file e cercare i caratteri "0d0a" o "0a".

Puoi usare cat -v <filename> come suggerisce @warriorpostman.

9
Rich

Prova "file -k"

A volte devo controllare questo per i file di certificato PEM.

Il problema con file regolare è questo: a volte sta cercando di essere troppo intelligente/troppo specifico.

Proviamo un piccolo quiz: ho alcuni file. E uno di questi file ha terminazioni di linea diverse. Quale?

(A proposito: questo è quello che appare come una delle mie tipiche cartelle "certificate work".)

Proviamo regolarmente file:

$ 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. Non mi sta dicendo i finali di linea. E già sapevo che quelli erano file cert. Non avevo bisogno di "file" per dirmelo.

Cos'altro puoi provare?

Potresti provare dos2unix con l'opzione --info in questo modo:

$ 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

Quindi questo ti dice che: sì, "0.esempio.end.cer" deve essere l'uomo dispari. Ma che tipo di terminazioni di linea ci sono? Do tu conosci il formato di output dos2unix a memoria? (Io non.)

Ma fortunatamente c'è l'opzione --keep-going (o -k in breve) in 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

Eccellente! Ora sappiamo che il nostro file dispari ha terminazioni di riga DOS (CRLF). (E gli altri file hanno terminazioni di riga Unix (LF) .Questo non è esplicito in questo output.E 'implicito.E' solo il modo in cui file si aspetta che un file di testo "normale" sia.)

(Se vuoi condividere il mio codice mnemonico: "L" è per "Linux" e per "LF".)

Ora convertiamo il colpevole e riproviamo:

$ 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  

Buono. Ora tutti i certificati hanno terminazioni di linea Unix.

Ulteriori letture

7
StackzOfZtuff

È possibile utilizzare vim -b filename per modificare un file in modalità binaria, che mostrerà ^ M caratteri per il ritorno a capo e una nuova riga è indicativa di LF che è presente, indicando le terminazioni di riga di Windows CRLF. Di LF intendo \n e di CR intendo \r. Si noti che quando si utilizza l'opzione -b il file verrà sempre modificato in modalità UNIX per impostazione predefinita, come indicato da [unix] nella riga di stato, il che significa che se si aggiungono nuove righe terminano con LF, non con CRLF. Se si utilizza la normale vim senza -b su un file con terminazioni di riga CRLF, si dovrebbe vedere [dos] mostrato nella riga di stato e le righe inserite avranno CRLF come fine riga. La documentazione di vim per l'impostazione fileformats spiega le complessità.

Inoltre, non ho abbastanza punti per commentare la risposta Notepad ++, ma se usi Notepad ++ su Windows, usa il menu Visualizza/Mostra simbolo/Mostra fine riga per visualizzare CR e LF. In questo caso viene visualizzato LF mentre per vim il LF è indicato da una nuova riga.

4
smalers

È possibile utilizzare il comando todos filename per convertire in terminazioni DOS e fromdos filename per convertire in terminazioni di riga UNIX. Per installare il pacchetto su Ubuntu, digitare Sudo apt-get install tofrodos.

4
Zorayr

Ho scaricato il mio output in un file di testo. Lo apro quindi nel blocco note ++ e poi sul pulsante Mostra tutti i personaggi. Non molto elegante ma funziona.

0
Diego