Как узнать окончания строк в текстовом файле? - PullRequest
245 голосов
/ 26 августа 2010

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

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

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

Ответы [ 10 ]

351 голосов
/ 26 августа 2010

Вы можете использовать утилиту 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

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

120 голосов
/ 26 августа 2010

In vi ...

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

:set nolist, чтобы вернуться в нормальное состояние.

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

:set ff

В качестве альтернативы, с bash вы можете использовать od -t c <filename> или просто od -c <filename> для отображения результатов.

96 голосов
/ 26 августа 2010

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

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

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

86 голосов
/ 20 декабря 2015

Ubuntu 14.04:

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

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

14 голосов
/ 27 июля 2015

Чтобы отобразить 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.
9 голосов
/ 10 сентября 2013

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

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

8 голосов
/ 22 ноября 2017

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

Короткая версия: file -k somefile.txt скажет вам.

  • Будет выведено with CRLF line endings для DOS / Windowsокончания строки.
  • Выводит with LF line endings для концов строки MAC.
  • А для Linux / Unix строка "CR" будет просто выводить text.(Таким образом, если в нем явно не упоминается какой-либо вид line endings, то это неявно означает: «Окончания строки CR» .)

Длинная версия ниже.


Реальное приложение: кодировка сертификата

Мне иногда приходится проверять это для файлов сертификатов 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

Итак, это говорит о том, что: yup, "0.example.end.cer" должен быть нечетным человеком.Но что за концы строк? вы знаете формат вывода dos2unix наизусть?(Не знаю.)

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

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data

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

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

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

$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data  

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

Дальнейшее чтение

4 голосов
/ 15 сентября 2017

Вы можете использовать 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, используйте View / Show Symbol / ShowКонец строки меню для отображения CR и LF.В этом случае отображается LF, тогда как для vim LF указывается новой строкой.

4 голосов
/ 29 октября 2012

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

0 голосов
/ 13 октября 2015

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

...