Как узнать окончание строки в текстовом файле?
Я пытаюсь использовать что-то в bash, чтобы показать мне, окончания строк в файле напечатано, а не интерпретировать. Файл представляет собой дамп из SSIS / SQL Server, считываемый машиной Linux для обработки.
есть ли какие-либо переключатели внутри
vi
,less
,more
и т. д.?в дополнение к просмотру окончаний строк, мне нужно знать, какой тип конца строки это (
CRLF
илиLF
). Как мне это выяснить?
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
преобразование уже преобразованного файла не имеет эффекта, поэтому безопасно работать вслепую (т. е. без тестирования формата), хотя обычные оговорки применяются, как всегда.
на 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) chars. as ^M
. Таким образом, строка-окончание \r\n
последовательности будут отображаться как ^M
В конце каждой выходной линии. cat -e
дополнительно визуализировать \n
, а как $
. (cat -et
дополнительно визуализирует символы табуляции. как ^I
.)
Ubuntu 14.04:
простой cat -e <filename>
работает просто отлично.
это отображает окончание строки Unix (\n
или LF) как $
и окончания строк Windows (\r\n
или CRLF) как ^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.образец.конец.cer " должно быть, нечетный человек. Но что это за концовки? Do вы знать формат dos2unix на сердце? (Я не знаю.)--19-->
но, к счастью, есть --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.
более дальнеишее чтение
man file
man dos2unix
- Википедия: Newline
можно использовать 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 ++ и нажимаю кнопку Показать все символы. Не очень элегантно, но работает.