Как узнать окончание строки в текстовом файле?

Я пытаюсь использовать что-то в bash, чтобы показать мне, окончания строк в файле напечатано, а не интерпретировать. Файл представляет собой дамп из SSIS / SQL Server, считываемый машиной Linux для обработки.

  • есть ли какие-либо переключатели внутри vi, less, more и т. д.?

  • в дополнение к просмотру окончаний строк, мне нужно знать, какой тип конца строки это (CRLF или LF). Как мне это выяснить?

10 ответов


можно использовать file утилита, чтобы дать вам представление о типе окончания строки.

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

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

конвертировать из "DOS"в Unix:

$ dos2unix testfile2.txt

преобразование из Unix в "DOS":

$ unix2dos testfile1.txt

преобразование уже преобразованного файла не имеет эффекта, поэтому безопасно работать вслепую (т. е. без тестирования формата), хотя обычные оговорки применяются, как всегда.


на vi...

:set list чтобы увидеть окончания строк.

:set nolist вернуться к нормальной жизни.

пока я не думаю, что вы можете видеть \n или \r\n на vi, вы можете увидеть, какой тип файла это (UNIX, DOS и т. д.) чтобы определить, какие у него окончания строк...

:set ff

или bash можно использовать od -t c <filename> или просто od -c <filename> для отображения возвращает.


в оболочке bash, попробовать cat -v <filename>. Это должно отображать возврат каретки для файлов windows.

(это сработало для меня в rxvt через Cygwin в Windows XP).

Примечание редактора: cat -v показывает \r (CR) chars. as ^M. Таким образом, строка-окончание \r\n последовательности будут отображаться как ^M В конце каждой выходной линии. cat -e дополнительно визуализировать \n, а как $. (cat -et дополнительно визуализирует символы табуляции. как ^I.)


Ubuntu 14.04:

простой cat -e <filename> работает просто отлично.

это отображает окончание строки Unix (\n или LF) как $ и окончания строк Windows (\r\n или CRLF) как ^M$.


чтобы показать CR как ^M меньше использовать less -u или типа -u еще меньше работает.

man less говорит:

-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.

можно использовать xxd для отображения шестнадцатеричного дампа файла и поиска символов" 0d0a "или" 0a".

можно использовать cat -v <filename> как предлагает @warriorpostman.


вы можете использовать команду todos filename для преобразования в DOS окончаний, и fromdos filename для преобразования в окончание строки UNIX. Чтобы установить пакет на Ubuntu, введите sudo apt-get install tofrodos.


попробуйте "file-k"

иногда мне приходится проверять это для файлов сертификатов PEM.

проблема с регулярными file это: иногда он пытается быть слишком умным / слишком конкретным.

давайте попробуем немного викторины: у меня есть несколько файлов. И один из этих файлов имеет разные окончания строк. Который?

(кстати: так выглядит один из моих типичных каталогов "работа с сертификатами".)

давайте попробуем обычный 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

да. Это не говорит мне о концовках строк. А я уже знал что это были файлы сертификатов. Мне не нужно было "досье", чтобы понять это.

что еще можно попробовать?

вы можете попробовать dos2unix С --info переключатель такой:

$ 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

Итак, это говорит вам, что: да, " 0.образец.конец.cer " должно быть, нечетный человек. Но что это за концовки? Do вы знать формат dos2unix на сердце? (Я не знаю.)--19-->

но, к счастью, есть --keep-going (или -k для краткости) параметр file:

$ file --keep-going -- *
0.example.end.cer:         PEM certificate2- , ASCII text, with CRLF line terminators2- data
0.example.end.key:         PEM RSA private key2- , ASCII text2- data
1.example.int.cer:         PEM certificate2- , ASCII text2- data
2.example.root.cer:        PEM certificate2- , ASCII text2- data
example.opensslconfig.ini: ASCII text2- data
example.req:               PEM certificate request2- , ASCII text2- data

отлично! Теперь мы знаем, что наш нечетный файл имеет DOS (CRLF) окончаний строк. (И другие файлы имеют Unix (LF) окончаний строк. Это не является явным в этом выводе. Это неявное. Это просто путь file ожидает, что" обычный " текстовый файл будет.)

(если вы хотите поделиться моей мнемоники: "L" для "Linux" и для "LF".)

теперь давайте преобразуем виновника и попробуем еще раз:

$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate2- , ASCII text2- data
0.example.end.key:         PEM RSA private key2- , ASCII text2- data
1.example.int.cer:         PEM certificate2- , ASCII text2- data
2.example.root.cer:        PEM certificate2- , ASCII text2- data
example.opensslconfig.ini: ASCII text2- data
example.req:               PEM certificate request2- , ASCII text2- data  

хорошо. Теперь все сертификаты имеют окончание строки Unix.

более дальнеишее чтение


можно использовать vim -b filename для редактирования файла в двоичном режиме, который будет показывать символы ^M для возврата каретки, а новая строка указывает на присутствие LF, указывая окончания строки Windows CRLF. Под LF я подразумеваю \n и под CR я имею в виду \r. Обратите внимание, что при использовании опции-b файл всегда будет редактироваться в режиме UNIX по умолчанию, как указано [unix] в строке состояния, что означает, что если вы добавите новые строки, они закончатся LF, а не CRLF. Если вы используете обычный vim без -b в файле с окончаниями строк CRLF вы должны увидеть [dos] показано в строке состояния и вставленные строки будут иметь CRLF в качестве конца строки. Документация vim для fileformats настройки объясняет сложности.

кроме того, у меня недостаточно очков, чтобы прокомментировать ответ Notepad++, но если вы используете Notepad++ в Windows, используйте меню Вид / Показать символ / показать конец строки для отображения CR и LF. В этом случае LF отображается, тогда как для vim LF указывается новой строкой.


Я сбрасываю вывод в текстовый файл. Затем я открываю его в notepad ++ и нажимаю кнопку Показать все символы. Не очень элегантно, но работает.