Как узнать окончания строк в текстовом файле?
Я пытаюсь использовать что-то в 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 file
man 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 обозначается новой строкой.