Конвертация текстовых файлов между UNIX и Windows
Проблема вкратце
Текстовые файлы на UNIX/Linux используют символ окончания строки LF (line feed, \n). Windows использует пару символов CR+LF (carriage return + line feed, \r\n). Когда файл создают в одной системе и открывают в другой без конверсии, видны артефакты:
- В Windows-среде строки из UNIX часто отображаются в одну строку.
- В UNIX-среде в текстах из Windows часто видны символы ^M (то есть CR) в конце строк.
Это бытовая проблема для администратора, разработчика и пользователя.
Основные инструменты и команды
Ниже — рабочие и простые в использовании команды. Перед массовыми изменениями сделайте резервную копию.
dos2unix и unix2dos
Самые простые утилиты для преобразования формата конца строки.
dos2unix windows.txt unix.txt
unix2dos unix.txt windows.txtПервая команда берёт файл windows.txt, конвертирует и записывает unix.txt. Обратная команда делает файл совместимым с Windows.
Важно: в некоторых дистрибутивах dos2unix перезаписывает входной файл, если указать только одно имя файла.
awk
awk удобно применять в скриптах. Примеры:
awk '{ sub("\\r$", ""); print }' windows.txt > unix.txt
awk '{ sub("$", "\\r"); print }' unix.txt > windows.txtПервая команда удаляет завершающий \r (CR). Вторая добавляет \r перед \n.
sed
sed — лёгкий инструмент для потоковой обработки:
sed 's/\r$//' windows.txt > unix.txt
sed 's/$/\r/' unix.txt > windows.txtsed часто быстрее и удобнее в одноразовых задачах.
perl
Perl — гибкий вариант, похожий по синтаксису на sed/awk:
perl -pe 's/\r$//' windows.txt > unix.txt
perl -pe 's/$/\r/' unix.txt > windows.txttr
tr пригоден для удаления символов по-кодам. Для удаления CR и Ctrl-Z (конца файла в старых Windows) используйте перенаправление:
tr -d '\015\032' < windowsfile.txt > unixfile.txtЗдесь \015 — восьмеричный код для CR, \032 — для Ctrl-Z. tr работает на побайтовом уровне и не меняет кодировку.
Редактор Vim (Vi)
В Vim можно удалить CR во всём файле одной командой. Откройте файл и выполните:
:1,$s/^M//gЧтобы ввести символ ^M в команду, в режиме ввода нажмите Ctrl+V затем Ctrl+M. После выполнения сохраните файл (:w).
FTP и режимы передачи
FTP-клиенты обычно имеют режимы ASCII и BINARY. При передаче текстовых файлов в ASCII-кодировке клиент автоматически конвертирует окончания строк между системами.
В командной строке FTP введите:
asciiПримечание: используйте ASCII только для настоящих текстовых файлов. Для архивов и двоичных файлов — BINARY.
Когда эти методы не сработают (ограничения и исключения)
- Файлы с смешанными окончаниями строк (внутри одного файла встречаются и LF, и CRLF). Нужен ручной аудит и скрипты, нормализующие окончания.
- Двоичные файлы или данные с фиксированными смещениями: изменение байтов нарушит формат. Никогда не запускайте текстовые конверторы на бинарных файлах.
- Файлы с BOM (Byte Order Mark) в UTF‑8: некоторые утилиты могут корректно работать, но BOM стоит учитывать отдельно.
- Отсутствие прав на запись: проверяйте права и владельца перед изменением файлов.
Альтернативные подходы и лучшие практики
- Используйте Git-правила .gitattributes и настройку core.autocrlf для автоматической нормализации при коммитах/клонах.
- В CI/CD включайте шаг проверки окончания строк (lint), чтобы предотвратить попадание неправильных форматов в репозиторий.
- Для массовой миграции сначала пробегите проверку (dry‑run), затем применяйте изменения партиями.
Быстрая памятка — команды на одной странице
Windows → UNIX:
- dos2unix file
- sed ‘s/\r$//‘ file > out
- perl -pe ‘s/\r$//‘ file > out
- tr -d ‘\015\032’ < file > out
- awk ‘{ sub(“\r$”, “”); print }’ file > out
UNIX → Windows:
- unix2dos file
- sed ‘s/$/\r/‘ file > out
- perl -pe ‘s/$/\r/‘ file > out
- awk ‘{ sub(“$”, “\r”); print }’ file > out
FTP: включите режим ascii при передаче текстовых файлов.
Vim: :1,$s/^M//g (Ctrl+V Ctrl+M для вставки ^M).
Контроль качества и критерии приёмки
Перед сдачей миграции убедитесь, что:
- Все тексты читаются в целевой ОС без визуальных артефактов.
- Никакие двоичные файлы не были изменены.
- Резервные копии созданы и тестовые файлы пройдены.
- В репозитории применены правила автоконверсии (если релевантно).
Критерии приёмки:
- Текстовые файлы отображаются корректно в целевой среде.
- Авотоматические тесты (если есть) не падают из-за ошибок формата строк.
Роль‑ориентированные чеклисты
Системный администратор:
- Создать резервную копию всего набора файлов.
- Запустить пакетную конверсию в тестовой среде.
- Проверить целостность и права после операции.
Разработчик:
- Настроить .gitattributes и core.autocrlf.
- Добавить проверку окончаний строк в pre-commit hook.
Тестировщик:
- Открыть ключевые файлы в целевых редакторах и проверить отображение.
- Выполнить smoke‑tests приложения.
Советы по отладке и проверке
- Найти файлы с CR символами:
grep -rl $'\r' .- Проверить тип окончания строк в файле (hexdump):
xxd file | head- Использовать утилиту file для проверки типа файла:
file filenameПримеры неочевидных проблем и как их решать
- Проблема: смешанные окончания строк в одном файле. Решение: используйте sed/awk для нормализации всех строк, затем проверьте результаты.
- Проблема: текст выглядит правильно в редакторе, но приложение ломается. Решение: проверьте кодировку (UTF‑8/UTF‑16) и наличие BOM.
- Проблема: Git постоянно меняет окончания строк. Решение: согласуйте правила в .gitattributes и сообщите команде.
Часто задаваемые вопросы
Как быстро обнаружить, какие файлы имеют CRLF?
Используйте grep по каталогу:
grep -rl $'\r' /path/to/dirМожно ли конвертировать прямо на месте без промежуточного файла?
Да, многие утилиты поддерживают перезапись. Например, dos2unix может перезаписать файл. Но рекомендую сначала сохранять копию.
Что делать с файлами в бинарном формате?
Не применяйте текстовые конверторы к бинарным файлам. Пользуйтесь передачей в режиме BINARY и делайте контрольные суммы перед и после.
Итог
Проблема несовместимых окончаний строк решается набором простых инструментов: dos2unix/unix2dos, sed, awk, perl, tr, а также настройками FTP и Git. Всегда делайте резервные копии и проверяйте кодировку и тип файла перед массовыми преобразованиями.
Важно: не меняйте байты в бинарных файлах и проверяйте смешанные окончания строк отдельно.
Похожие материалы
Unity Lights: циферблат Apple Watch для Black History Month
Обновление видеодрайвера для Rainbow Six Siege
Ограничение частоты запросов в ASP.NET Core
Исправление лагов Android: TRIM и LagFix
Семафоры в Bash: что это и как реализовать