Полное руководство: преобразование CRLF в LF в Vim
Узнайте несколько способов преобразовать CRLF Windows в LF Linux в Vim. Удалите ^M встроенными командами, поиском/заменой или внешними инструментами.
Как преобразовать окончания строк DOS/Windows в окончания строк Linux в Vim?
Когда я открываю файлы, созданные в Windows, строки заканчиваются символами ^M. Как удалить эти символы сразу в Vim?
Чтобы преобразовать окончания строк DOS/Windows (CRLF) в окончания строк Linux (LF) в Vim и удалить символы ^M, можно воспользоваться несколькими встроенными командами и техниками Vim. Символ ^M представляет собой символ возврата каретки (CR), который Windows добавляет в конце каждой строки в составе последовательности CRLF, тогда как в Linux обычно используется только символ переноса строки (LF).
Содержание
- Понимание окончаний строк
- Метод 1: Использование команды
fileformatв Vim - Метод 2: Поиск и замена символов ^M
- Метод 3: Использование внешних команд в Vim
- Метод 4: пакетная обработка нескольких файлов
- Профилактика и настройка
- Проверка
Понимание окончаний строк
Прежде чем переходить к решениям, полезно понять, что означают эти окончания строк:
- Windows/DOS: использует CRLF (Carriage Return + Line Feed) – в Vim отображается как
^M$ - Linux/Unix: использует только LF (Line Feed) – в Vim отображается как
$ - macOS (старые версии): использовал только CR (Carriage Return)
Согласно документации Wikipedia о переводах строк, эти различия возникли из‑за того, что разные операционные системы исторически использовали разные соглашения для обозначения разрыва строки. Когда файлы, созданные в Windows, открываются в Linux, лишний символ возврата каретки (^M) становится видимым и может вызвать проблемы с скриптами и обработкой текста.
Метод 1: Использование команды fileformat в Vim
Самый простой и элегантный способ в Vim – использовать встроенную конвертацию формата файла:
:set fileformat=unix
:w
Эта команда сообщает Vim преобразовать формат файла из текущего (вероятно, dos) в Unix‑формат, удаляя все окончания CRLF и заменяя их только LF.
Для автоматической конвертации при сохранении:
:set fileformat=unix | w
Чтобы сделать это постоянным для текущей сессии:
:set fileformat=unix
:set nobomb
Параметр nobomb гарантирует, что при конвертации не будет добавлен BOM UTF‑8.
Метод 2: Поиск и замена символов ^M
Если вы предпочитаете явно увидеть и удалить символы ^M, можно воспользоваться поиском и заменой в Vim:
Как правильно ввести символ ^M:
- Нажмите
Ctrl+V, затемCtrl+M, чтобы вставить сам символ возврата каретки
Базовый поиск и замена:
:%s/^M//g
Альтернативный метод с использованием escape‑последовательностей:
:%s/\r//g
Эта команда ищет все вхождения ^M (CR) и заменяет их на пустую строку, тем самым удаляя их, но сохраняя символы переноса строки.
Интерактивный поиск и замена:
:%s/^M//gc
Флаг c запрашивает подтверждение перед каждой заменой, что удобно для проверки изменений.
Метод 3: Использование внешних команд в Vim
Vim может выполнять внешние команды оболочки, открывая дополнительные варианты конвертации:
Использование dos2unix:
:!dos2unix %
Эта команда запускает утилиту dos2unix для текущего файла (%). dos2unix специально предназначен для преобразования текстовых файлов из формата DOS/Windows в Unix, заменяя CRLF на LF.
Использование sed:
:%s/\r//g
Или напрямую через sed:
:%!sed 's/\r//g'
Использование tr:
:%!tr -d '\r'
Эта команда удаляет символы возврата каретки.
Примечание: Согласно документации Hexmos о dos2unix, эти инструменты специально созданы для «изменения окончаний строк DOS‑стиля на Unix‑стиль. Заменяет CRLF на LF».
Метод 4: пакетная обработка нескольких файлов
Если нужно преобразовать несколько файлов в каталоге:
Использование списка аргументов Vim:
:args *.txt
:argdo %s/\r//g | update
Эта команда обрабатывает все файлы с расширением .txt в текущем каталоге, удаляя символы ^M из каждого из них.
Использование внешних команд в пакетном режиме:
:!find . -name "*.txt" -exec dos2unix {} \;
Эта команда ищет все файлы .txt в текущем каталоге и подкаталогах и применяет к каждому dos2unix.
Профилактика и настройка
Чтобы избежать подобных проблем в будущем, можно настроить окружение разработки:
Настройка Git для кроссплатформенной разработки:
git config --global core.autocrlf true
Это заставит Git автоматически преобразовывать окончания строк при коммите и извлечении файлов.
Настройка Vim для автоматического определения формата файла:
Добавьте в ваш .vimrc:
autocmd BufReadPost * if &fileformat == "dos" | setlocal fileformat=unix | endif
Это автоматически преобразует файлы DOS в Unix при открытии в Vim.
Установка формата файла по умолчанию:
set fileformat=unix
Добавьте это в ваш .vimrc, чтобы Unix был форматом по умолчанию для всех новых файлов.
Проверка
После конвертации можно проверить окончания строк:
В Vim, отображение окончаний строк:
:set list
Это покажет специальные символы, включая окончания строк. Вы должны увидеть только $ в конце строк, а не ^M$.
С помощью команд ex:
:verbose set fileformat?
С помощью команд оболочки:
:!file %
Или проверить конкретные символы:
:/%\r/
Эта команда ищет любые оставшиеся символы возврата каретки в файле.
Согласно документации Wikipedia о переводах строк, можно также использовать команды grep для проверки окончаний строк:
egrep -l '\r\n' filename.txt # Показывает файлы в стиле DOS (CRLF)
egrep -L '\r\n' filename.txt # Показывает файлы в стиле Unix (только LF)
Эти методы эффективно выявляют и обрабатывают различные форматы окончаний строк на разных платформах.
Заключение
Преобразование окончаний строк Windows в формат Linux в Vim простое и доступно несколькими подходами:
- Используйте
:set fileformat=unix– самый элегантный встроенный способ. - Поиск и замена
:%s/^M//g– если нужно явно увидеть и удалить ^M. - Внешние команды (
dos2unix,sed,tr) – для более сложных операций. - Настройка окружения – чтобы предотвратить будущие проблемы с Git и Vim.
Для большинства случаев :set fileformat=unix и последующее :w – самый простой и надёжный метод. Он автоматически обрабатывает конвертацию без необходимости видеть или манипулировать отдельными символами.
Помните, что правильное управление окончаниями строк критично для кроссплатформенной разработки, поскольку разные операционные системы используют разные соглашения, и их смешивание может вызвать проблемы с скриптами, системами контроля версий и утилитами обработки текста.