Как узнать окончания строк в текстовом файле?
Я пытаюсь использовать что-то в 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преобразование уже преобразованного файла не имеет никакого эффекта, поэтому безопасно работать вслепую (т. е. без предварительного тестирования формата), хотя обычные отказы применяются, как всегда.
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-окончания строк.
более дальнеишее чтение
man fileman dos2unix- Википедия: новая строка
можно использовать
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 обозначается новой строкой.