Czy istnieje sposób na szybką identyfikację plików z zakończeniem linii w systemie Windows lub Unix?

8

Wiem, że możemy użyć dos2unix do konwersji między zakończeniem linii Windows i Unix. Zastanawiam się, czy istnieje jakieś polecenie, które może mi powiedzieć, czy plik ma zakończenie linii w systemie Windows lub Unix?

Oliver
źródło

Odpowiedzi:

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

Jeśli uważasz, że konieczne jest sprawdzenie każdej linii w pliku, możesz to zrobić:

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

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

„^ M” został wprowadzony przy użyciu Ctrl + V Ctrl + M i jest znakiem ASCII powrotu karetki (CR).

Widzimy tutaj, że plik f1 ma trzy linie, ale nie ma CR, więc wszystkie zakończenia linii muszą być solo LF w stylu uniksowym.

Plik f2 ma taką samą liczbę linii i CR, więc rozsądne jest odgadnięcie, że używa on końcówek linii CR, LF używanych przez MSDOS i Windows.

RedGrittyBrick
źródło
1
filenie wyświetla statusu zakończenia linii, jeśli może znaleźć dopasowanie bliższe niż ASCII, tj setup.py: a python script text executable. Nie można znaleźć flagi, która zmieni to zachowanie.
miracle2k
1
@ miracle2k: Być może można by stworzyć niestandardowy plik magiczny. file -m magicfile f1 f2 f3
RedGrittyBrick
1

W systemie Windows szybkim sposobem na sprawdzenie jest otwarcie pliku w Notatniku. Notatnik pokaże podział linii tylko na zakończeniach w stylu Windows (CR + LF), a nie na zakończeniach unixowych (LF). Twój tekst uniksowy będzie wyglądał następująco:

Line1Line2Line3Line4

podczas gdy tekst Windows będzie wyglądał następująco:

line1
line2
line3
line4

Nie znam się na platformie unix / linux, ale jestem pewien, że możesz używać podobnych hacków z programami takimi jak gedit lub emacs.

Prahlad Yeri
źródło
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

Zauważ, że ze względu na szybkość liczone są tylko pojedyncze \rlitery \nsi, ale byłby to dość zwariowany plik, który miałby taką samą liczbę obu typów, a mimo to nie był plikiem Windows CRLF ...

Zauważ też, że narzędzie * nix filenie wykonuje pełnego skanu pliku, podczas gdy ten perlskrypt to robi. Nie wspomniałeś, na której platformie ma działać; Użyłem bashskryptu do przetestowania danych wyjściowych Perla, ale można go zmienić na cmdskrypt Windows .

Możesz po prostu przesłać do niego swój plik.

Peter.O
źródło