Esiste un modo per identificare rapidamente i file con terminazione di linea Windows o Unix?


8

So che possiamo usare dos2unix per convertire tra Windows e la terminazione della linea Unix. Mi chiedo se c'è qualche comando che può dirmi se un file ha terminazione di linea Windows o Unix?

Risposte:


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

Se ritieni necessario controllare ogni riga del file, puoi farlo:

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

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

La "^ M" è stata inserita usando Ctrl + V Ctrl + M ed è il carattere ASCII di ritorno a capo (CR).

Qui vediamo che il file f1 ha tre righe ma nessun CR, quindi tutte le terminazioni di riga devono essere LF in stile Unix.

Il file f2 ha un numero uguale di righe e CR, quindi è ragionevole indovinare che utilizza le terminazioni di riga CR, LF utilizzate da MSDOS e Windows.


1
filenon genera lo stato di fine riga se riesce a trovare una corrispondenza più vicina di ASCII, ad es setup.py: a python script text executable. Non riesco a trovare una bandiera per cambiare quel comportamento.
miracle2k,

1
@ miracle2k: forse è possibile creare un file magico personalizzato per farlo. file -m magicfile f1 f2 f3
RedGrittyBrick,

1

Su Windows, un modo rapido per dirlo è aprire il file in Blocco note. Blocco note mostrerà le interruzioni di riga solo sulle terminazioni di stile di Windows (CR + LF) e non sulle terminazioni di Unix (LF). Quindi il tuo testo unix sarà simile al seguente:

Line1Line2Line3Line4

al contrario, il testo di Windows sarà simile al seguente:

line1
line2
line3
line4

Non ho molta familiarità con la piattaforma unix / linux, ma sono sicuro che puoi usare hack simili con programmi come gedit o emacs.


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

Nota, per amor di velocità, vengono conteggiati solo i singoli \rs \n, ma sarebbe un file piuttosto bizzarro che aveva un numero uguale di entrambi i tipi e tuttavia non era un file CRLF di Windows ...

Si noti inoltre che lo strumento * nix filenon esegue una scansione completa del file, mentre questo perlscript lo fa. Non hai menzionato su quale piattaforma desideri che funzioni; Ho usato lo bashscript per testare l'output di perl, ma questo può essere cambiato in Window cmdscript.

Puoi semplicemente reindirizzare il tuo file ad esso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.