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

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

warriorpostman
источник
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.

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

StackzOfZtuff
источник
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.

Zorayr
источник
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 указывается новой строкой.

smalers
источник
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.

jeremysprofile
источник