Gibt es eine Möglichkeit, Dateien mit Windows- oder Unix-Leitungsabschluss schnell zu identifizieren?

8

Ich weiß, dass wir dos2unix verwenden können , um zwischen Windows- und Unix-Leitungsabschluss zu konvertieren. Ich frage mich, ob es einen Befehl gibt, der mir sagt, ob eine Datei eine Windows- oder Unix-Zeilenbeendigung hat.

Oliver
quelle

Antworten:

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

Wenn Sie es für notwendig halten, jede Zeile in der Datei zu überprüfen, können Sie Folgendes tun:

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

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

Das "^ M" wurde mit Strg + V Strg + M eingegeben und ist das ASCII-Wagenrücklaufzeichen (CR).

Hier sehen wir, dass die Datei f1 drei Zeilen, aber keine CRs hat, sodass alle Zeilenenden Solo-LFs im Unix-Stil sein müssen.

Die Datei f2 hat die gleiche Anzahl von Zeilen und CRs, sodass zu vermuten ist, dass die von MSDOS und Windows verwendeten Zeilenenden CR, LF verwendet werden.

RedGrittyBrick
quelle
1
fileGibt keinen Zeilenende-Status aus, wenn eine engere Übereinstimmung als ASCII gefunden werden kann, d setup.py: a python script text executable. h . A scheint keine Flagge zu finden, um dieses Verhalten zu ändern.
miracle2k
1
@ miracle2k: Vielleicht könnte eine benutzerdefinierte Magicfile erstellt werden, um dies zu tun. file -m magicfile f1 f2 f3
RedGrittyBrick
1

Unter Windows können Sie dies schnell feststellen, indem Sie Ihre Datei im Editor öffnen. Der Editor zeigt Zeilenumbrüche nur bei Terminierungen im Windows-Stil (CR + LF) und nicht bei Unix-Terminierungen (LF) an. Ihr Unix-Text sieht also folgendermaßen aus:

Line1Line2Line3Line4

Windows-Text sieht folgendermaßen aus:

line1
line2
line3
line4

Ich bin mit der Unix / Linux-Plattform nicht sehr vertraut, aber ich bin sicher, dass Sie ähnliche Hacks mit Programmen wie gedit oder emacs verwenden können.

Prahlad Yeri
quelle
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

Beachten Sie, dass aus Geschwindigkeitsgründen nur einzelne \rs und \ns gezählt werden, aber es wäre eine ziemlich verrückte Datei, die die gleiche Anzahl beider Typen hatte und dennoch keine Windows CRLF-Datei war ...

Beachten Sie auch, dass das * nix-Tool filedie Datei nicht vollständig scannt, während dieses perlSkript dies tut. Sie haben nicht erwähnt, auf welcher Plattform es ausgeführt werden soll. Ich habe ein bashSkript verwendet, um die Ausgabe von Perl zu testen, aber das kann in ein Fensterskript geändert werden cmd.

Sie können Ihre Datei einfach an sie weiterleiten.

Peter.O
quelle