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


304

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

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

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


1
Общий совет: если у вас есть представление о том, какую команду * nix / cygwin вы можете использовать, вы всегда можете просмотреть ее справочную страницу для поиска переключателей, которые могут предоставить вам необходимые функции. Например, man less.
Дэвид Риверс

Ответы:


421

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

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


9
Теперь их иногда называют «fromdos» и «todos» соответственно (как в случае с Ubuntu 10.4+)
Джесс Чедвик

3
@JessChadwick: Да, но только если вы явно устанавливаете tofrodosпакет с sudo apt-get install tofrodos- так же, как вам нужно было бы запустить, sudo apt-get install dos2unixчтобы получить dos2unixи unix2dos.
mklement0

На самом деле dos2unix не может сделать всю работу, я думаю, что stackoverflow.com/questions/23828554/dos2unix-doesnt-convert-m дает лучший ответ
Натан

@nathan: Что dos2unixтерпит неудачу в? ФП в этом вопросе лишь смутно описывает проблему.
Приостановлено до дальнейшего уведомления.

Команда @DennisWilliamson file до и после команды dos2unix получала одинаковые выходные данные: исходный код xxx.c C, текст ASCII с символами CR, LF. Я обнаружил, что этот файл c имеет ^ M в середине строки, которой нравится xxxxxxx ^ M xxxxxxx
Натан

127

В vi...

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

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

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

:set ff

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


26
К сожалению, я не думаю, что vi может показать эти конкретные символы. Вы можете попробовать od -c <имя_файла>, которое, я считаю, будет отображать \ n или \ r \ n.
Райан Бергер

3
В категории «для чего это стоит» вы можете выполнить grep для CRLF в стиле Dos, введя grep --regex = "^ M", где ^ M - это CTRL + V CTRL + M. Вы можете удалить их, заменив их командой sed. По сути это то же самое, что и dos2unix
cowboydan

11
В vim: :set fileformatсообщит, какой из unixили dosvim считает, что в конце строки файла. Вы можете изменить его :set fileformat=unix.
Виктор Заманян

5
Используйте флаг -b при запуске vi / vim, а затем используйте: set list, чтобы увидеть окончания CR (^ M) и LF ($).
Самуил

1
@RyanBerger - Похоже, вам не хватает -t. Так и должно быть od -t c file/path, но спасибо за новую программу. Работал отлично!
Эрик Фоссум

113

Ubuntu 14.04:

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

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


7
Также работает на OSX. Хорошее решение Просто и сработало у меня, а принятого ответа нет. (Примечание: не было .txtфайла)
dlsso

4
является ли отображение M $ easteregg / Windows бить?
Том М,

Не работает с Solaris, но человек говорит, что это должно было сработать
Зевс

101

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

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

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


3
@ChrisK: попробуйте echo -e 'abc\ndef\r\n' | cat -vи вы должны увидеть ^Mпосле "def".
Приостановлено до дальнейшего уведомления.

Я хотел посмотреть, есть ли в файле ^ M (Windows / DOS EOL), и только cat -v показал мне это. +1 за это
Али

1
^ M = DOS / стиль Windows
Меркурий

Исправление: Таким образом, последовательности \ r \ n, заканчивающиеся строкой, будут отображаться как ^ M $
Шаян

19

Чтобы показать 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.

1
Пожалуйста, уточните свой ответ.
adao7000

12

Попробуйте fileзатем file -kзатемdos2unix -ih

fileобычно будет достаточно. Но для тяжелых случаев попробуйте file -kили dosunix -ih.

Подробности ниже.


Пытаться 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

Превосходно! Теперь мы знаем, что наш нечетный файл имеет CRLFокончания строки DOS ( ). (А у других файлов есть LFокончания строк Unix ( ). Это не явно в этом выводе. Это неявно. Это просто способ, которым 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.

Пытаться dos2unix -ih

Я не знал этого, когда писал пример выше, но:

На самом деле получается, что dos2unix выдаст вам строку заголовка, если вы будете использовать -ih(сокращение --info=h) следующим образом:

$ dos2unix -ih -- *
 DOS    UNIX     MAC  BOM       TXTBIN  FILE
   0      37       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

И еще один «настоящий» момент: формат заголовка действительно легко запомнить: вот две мнемоники:

  1. Это DUMB (слева направо: d для Dos, u для Unix, m для Mac, b для спецификации).
  2. А также: «DUM» это просто алфавитный порядок D, U и M.

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


1
Он генерирует вывод, как: Accounts.java: Java source, ASCII text\012-на Windows в MinTTY
одиночку

@standalone: ​​интересно. Я читал странные вещи о опции под названием «igncr» - и то, что вы говорите, звучит так. Но не могу воспроизвести то, что вы описываете. (Я попробовал внутри Bash внутри mintty, который поставляется с Git-for-Windows, «git version 2.24.0.windows.1».)
StackzOfZtuff

Хм, я попробовал file -k Accounts.javaвнутри mintty, который поставляется с git-for-windows тоже, но моя версияgit version 2.21.0.windows.1
одиночестве

Рабочее решение для меняcat -e file_to_test
автономно

9

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

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


1
У меня работает с cat v 8.23. Концы строк Unix не будут печатать никакой дополнительной информации, но окончания строк DOS будут печатать «^ M».
Богатый

Это должно быть то, что я сталкиваюсь с 8.21, учитывая тот факт, что я использую окончания строки Unix.
neanderslob

5

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


5

Вы можете использовать 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 End of Line для отображения CR и LF. В этом случае отображается LF, тогда как для vim LF указывается новой строкой.


0

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


3
Этот вопрос помечен как Linux, и я не думаю, что notepad ++ предназначен для Linux. Это должно работать для окон, хотя.
Рик Смит

0

Vim - всегда показывать переводы Windows как ^M

Если вы предпочитаете всегда видеть символы новой строки Windows в vim render as ^M, вы можете добавить эту строку в ваш .vimrc:

set ffs=unix

Это заставит vim интерпретировать каждый файл, который вы открываете, как файл unix. Так как файлы Unix имеют \nсимвол новой строки, файл Windows с символом новой строки \r\nбудет по-прежнему отображаться правильно (благодаря \n), но будет иметь ^Mв конце файла (именно так vim отображает \rсимвол).


Vim - иногда показывать переводы Windows

Если вы хотите установить его отдельно для каждого файла, вы можете использовать его :e ++ff=unixпри редактировании данного файла.


Vim - всегда показывать тип файла ( unixvs dos)

Если вы хотите в нижней строке Vim всегда отображать то , что FILETYPE вы редактируете (и вы не принудительно установить тип файла в UNIX) , вы можете добавить в ваш statuslineс
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}.

Моя полная статусная строка представлена ​​ниже. Просто добавь это к себе .vimrc.

" Make statusline stay, otherwise alerts will hide it
set laststatus=2
set statusline=
set statusline+=%#PmenuSel#
set statusline+=%#LineNr#
" This says 'show filename and parent dir'
set statusline+=%{expand('%:p:h:t')}/%t
" This says 'show filename as would be read from the cwd'
" set statusline+=\ %f
set statusline+=%m\
set statusline+=%=
set statusline+=%#CursorColumn#
set statusline+=\ %y
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\[%{&fileformat}\]
set statusline+=\ %p%%
set statusline+=\ %l:%c
set statusline+=\ 

Это будет как

.vim/vimrc\                                    [vim] utf-8[unix] 77% 315:6

внизу вашего файла


Vim - иногда показывает тип файла ( unixvs dos)

Если вы просто хотите посмотреть, какой тип файла у вас есть, вы можете использовать его :set fileformat(это не будет работать, если вы принудительно установите тип файла ). Он вернется unixдля файлов Unix и dosдля Windows.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.