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


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

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

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

10 201

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

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

In 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) символы. как ^M. Таким образом, строка-окончание \r\n последовательности будут отображаться как ^M В конце каждой выходной линии. cat -e дополнительно визуализировать \n, а как $. (cat -et дополнительно визуализирует символы табуляции. как ^I.)

Ubuntu 14.04:

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

это отображает Unix окончание строки (\n или LF) как $ и окончание строки Windows (\r\n или возврата каретки и перевода строки), как ^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.образец.конец.ЦЭИ", должно быть, странный человек. Но какие бывают окончания строк? Делай вы знать формат dos2unix на сердце? (Я не знаю.)

но, к счастью, есть --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 ++ и нажимаю кнопку Показать все символы. Не очень элегантно, но это работает.