8

Я знаю, что мы можем использовать dos2unix для конвертации между Windows и Unix. Мне интересно, есть ли какая-нибудь команда, которая может сказать мне, если файл имеет Windows или Unix конец строки?

3 ответа3

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

Если вы считаете необходимым проверить каждую строку в файле, вы можете сделать это:

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

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

«^ M» был введен с использованием Ctrl+V Ctrl+M и является символом возврата каретки (CR) ASCII.

Здесь мы видим, что файл f1 имеет три строки, но не содержит CR, поэтому все окончания строк должны быть одиночными LF в стиле Unix.

Файл f2 имеет одинаковое количество строк и CR, поэтому разумно предположить, что он использует окончания строк CR, LF, используемые в MSDOS и Windows.

1

В Windows быстрый способ узнать это - открыть файл в блокноте. Блокнот будет показывать разрывы строк только на концах стиля Windows (CR+LF), а не на концах Unix (LF). Так что ваш текст в Unix будет выглядеть так:

Line1Line2Line3Line4

тогда как текст Windows будет выглядеть так:

line1
line2
line3
line4

Я не очень знаком с платформой unix/linux, но я уверен, что вы можете использовать подобные хаки с такими программами, как gedit или 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

Обратите внимание, что из соображений скорости подсчитываются только отдельные \r s и \n s, но это был бы довольно дурацкий файл, который имел одинаковое количество обоих типов и все же не был файлом CRLF для Windows ...

Также обратите внимание, что file инструмента * nix не выполняет полное сканирование файла, в то время как этот скрипт perl делает. Вы не упомянули, на какой платформе вы хотите, чтобы она работала; Я использовал bash скрипт для проверки вывода perl, но его можно изменить на Window cmd скрипт.

Вы можете просто передать свой файл к нему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .