Файлы в ASCII-кодировке или совместимом наборе символов, для обозначения конца строки используют символы:
- LF (от англ. Line feed (перевод строки), 0x0A)
- CR (от англ. Carriage Return, 0x0D)
- CRLF (т.е. оба символа).
В windows-системах обычно используется CRLF, в unix — LF . В web-разработке преимущественно используются unix-системы, и как следствие, принято, чтобы в файлах окончания строк обозначались с помощью LF.
Тем не менее, иногда открываешь файл для редактирования и видишь ЭТО:
1 2 3 4 5 6 |
FOREACH row = services;^M SET service_row = {^M attr => {},^M list => [],^M };^M ^M |
Это означает, что кто-то отредактировал файл в текстовом редакторе под Windows. Подобный формат файла может привести к проблемам. Кроме того, такие файлы очень неудобно редактировать, находясь в unix-среде. Случайное удаление ^M приведет к нарушению формата файла и невозможности его корректного чтения.
Утилиты dos2unix и unix2dos
Для корректного преобразования формата файла удобно использовать утилиту dos2unix . При необходимости можно выполнить и обратное преобразование, с помощью unix2dos .
Установка:
1 2 |
$ sudo apt-get install dos2unix $ sudo apt-get install unix2dos |
По умолчанию, утилита dos2unix перезапишет указанный файл. Но можно использовать ключ -n и тогда преобразованный текст будет сохранен в другом файле, название которого нужно указать в качестве второго аргумента.
1 2 |
$ dos2unix filename.txt dos2unix: converting file filename.txt to Unix format ... |
Для массового преобразования файлов можно использовать маску:
1 |
$ dos2unix -k *.inc |
Ключ -k позволит оставить без изменений время создания файла.
Можно вместо конвертации исходного файла создать новый файл, который будет содержать данные в нужном формате:
1 |
$ dos2unix -n in.txt out.txt |
Использование unix2dos аналогично утилите dos2unix:
1 |
$ unix2dos filename.txt |
Утилиты todos и fromdos
Данные утилиты, так же как утилиты dos2unix и unix2dos, выполняют конвертацию файлов из unix-формата в windows-формат, и обратно.
Мне для работы удобно использовать dos2unix, поэтому fromdos я не устанавливала, но следует иметь ввиду такую возможность.
Утилита tr
1 |
$ cat service.inc | tr -d '\r' > memo.txt |
Т.е. утилита tr удалит символы «\r» из строк.
Преобразование конца строк в файлах с помощью perl
Чтобы изменить windows-формат окончания строк (CRLF) на unix-формат(LF), можно использовать perl:
1 |
# perl -pi -e 's/\r\n/\n/;' filename.txt |
Обратное преобразование из unix-формата (LF) в windows-формат (CRLF):
1 |
# perl -pi -e 's/\n/\r\n/;' filename.txt |
Для преобразования сразу нескольких файлов, можно использовать маску, вместо прямого указания имени файла:
1 |
# perl -pi -e 's/\n/\r\n/;' b* |
При указании маски, кавычки не используются, попытка их применения приведет к ошибке
«No such file or directory»:
1 2 |
# perl -pi -e 's/\n/\r\n/;' "b*" Can't open b*: No such file or directory. |
Если вы попробуете выполнить преобразование конца строк под windows, то получите ошибку
«Can’t do inplace edit without backup»:
1 2 |
> perl -pi -e 's/\r\n/\n/;' filename.txt Can't do inplace edit without backup. |
Это связано с ограничениями windows. Нужно использовать вот такую команду:
1 |
perl -i.bak -p -e 's/\r\n/\n/;' filename.txt && del filename.txt.bak |
Изменение кодировки файла с помощью утилиты iconv
Чтобы конвертировать файл in.txt из WINDOWS-1251 в UTF-8 out.txt, можно использовать утилиту iconv ( на примере Linux Ubunta ):
1 |
# iconv -f WINDOWS-1251 -t UTF-8 in.txt &> out.txt |
Чтобы посмотреть полный список кодировок, с которыми утилита может работать, нужно вызвать iconv с параметром —list :
1 2 3 4 5 6 7 8 9 10 11 |
# iconv --list The following list contains all the coded character sets known. This does not necessarily mean that all combinations of these names can be used for the FROM and TO command line parameters. One coded character set can be listed with several different names (aliases). 437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865, 866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4, 8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4, ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110, ... |