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

221

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

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

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

  • 0
    Общий совет: если у вас есть представление о том, какую команду * nix / cygwin вы можете использовать, вы всегда можете просмотреть ее справочную страницу для поиска переключателей, которые могут предоставить вам необходимые функции. Например, man less .
Теги:
newline
command-line
line-endings

11 ответов

303
Лучший ответ

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

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

  • 7
    Теперь их иногда называют «fromdos» и «todos» соответственно (как в случае с Ubuntu 10.4+)
  • 2
    @JessChadwick: Да, но только если вы явно устанавливаете пакет tofrodos с помощью sudo apt-get install tofrodos - точно так же, как вам нужно было бы запустить sudo apt-get install dos2unix чтобы получить dos2unix и unix2dos .
Показать ещё 4 комментария
117

В vi...

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

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

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

:set ff

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

  • 0
    Спасибо - это действительно сработало - теперь я пытаюсь сказать, является ли это \ n или \ r \ n, есть ли дополнительный переключатель для этого в Vi?
  • 21
    К сожалению, я не думаю, что vi может показать эти специфические символы. Вы можете попробовать od -c <имя_файла>, которое, я считаю, будет отображать \ n или \ r \ n.
Показать ещё 7 комментариев
82

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

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

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

  • 2
    @ChrisK: попробуйте echo -e 'abc\ndef\r\n' | cat -v и вы должны увидеть ^M после "def".
  • 0
    Я хотел посмотреть, есть ли в файле ^ M (Windows / DOS EOL), и только cat -v показал мне это. +1 за это
Показать ещё 2 комментария
76

Ubuntu 14.04:

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

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

  • 5
    Также работает на OSX. Хорошее решение Просто и сработало у меня, а принятого ответа нет. (Примечание: файл не был .txt )
  • 2
    Также работает на Windows с Git Bash
Показать ещё 3 комментария
13

Чтобы показать 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
    Пожалуйста, уточните свой ответ.
9

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

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

  • 0
    без кубиков в 14.04 с котом (GNU coreutils) 8.21
  • 1
    У меня это работает с cat v 8.23. Концы строк Unix не будут печатать никакой дополнительной информации, но окончания строк DOS будут печатать «^ M».
Показать ещё 1 комментарий
5

Попробуйте "файл -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

Это говорит о том, что: 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

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

3

Вы можете использовать vim -b filename для редактирования файла в двоичном режиме, в котором будут отображаться символы ^ M для возврата каретки, а новая строка указывает на присутствие LF, указывая окончания строк Windows CRLF. Под LF я имею в виду \n, а CR 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

Вы также можете использовать:

$ cat -v filename

который покажет ^M в конце, если Windows конец строки. Чтобы сделать что-то полезное в скрипте, вы можете проверить количество строк с таким окончанием строки, например, используйте следующее для подсчета строк. Обратная косая черта необходима для grep потому что ^ означает начало строки в регулярном выражении. Если существует вероятность того, что окончания строк смешиваются в файле, вы можете сравнить общее количество строк с окончаниями строк в Windows и убедиться, что они совпадают.

 $ countOfCR=$(cat -v filename | grep '\^M' | wc -l)

Затем используйте переменную countOfCR для выполнения некоторой логики.

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню