Другое

Полное руководство: преобразование 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).

Содержание

Понимание окончаний строк

Прежде чем переходить к решениям, полезно понять, что означают эти окончания строк:

  • 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 – использовать встроенную конвертацию формата файла:

vim
:set fileformat=unix
:w

Эта команда сообщает Vim преобразовать формат файла из текущего (вероятно, dos) в Unix‑формат, удаляя все окончания CRLF и заменяя их только LF.

Для автоматической конвертации при сохранении:

vim
:set fileformat=unix | w

Чтобы сделать это постоянным для текущей сессии:

vim
:set fileformat=unix
:set nobomb

Параметр nobomb гарантирует, что при конвертации не будет добавлен BOM UTF‑8.

Метод 2: Поиск и замена символов ^M

Если вы предпочитаете явно увидеть и удалить символы ^M, можно воспользоваться поиском и заменой в Vim:

Как правильно ввести символ ^M:

  • Нажмите Ctrl+V, затем Ctrl+M, чтобы вставить сам символ возврата каретки

Базовый поиск и замена:

vim
:%s/^M//g

Альтернативный метод с использованием escape‑последовательностей:

vim
:%s/\r//g

Эта команда ищет все вхождения ^M (CR) и заменяет их на пустую строку, тем самым удаляя их, но сохраняя символы переноса строки.

Интерактивный поиск и замена:

vim
:%s/^M//gc

Флаг c запрашивает подтверждение перед каждой заменой, что удобно для проверки изменений.

Метод 3: Использование внешних команд в Vim

Vim может выполнять внешние команды оболочки, открывая дополнительные варианты конвертации:

Использование dos2unix:

vim
:!dos2unix %

Эта команда запускает утилиту dos2unix для текущего файла (%). dos2unix специально предназначен для преобразования текстовых файлов из формата DOS/Windows в Unix, заменяя CRLF на LF.

Использование sed:

vim
:%s/\r//g

Или напрямую через sed:

vim
:%!sed 's/\r//g'

Использование tr:

vim
:%!tr -d '\r'

Эта команда удаляет символы возврата каретки.

Примечание: Согласно документации Hexmos о dos2unix, эти инструменты специально созданы для «изменения окончаний строк DOS‑стиля на Unix‑стиль. Заменяет CRLF на LF».

Метод 4: пакетная обработка нескольких файлов

Если нужно преобразовать несколько файлов в каталоге:

Использование списка аргументов Vim:

vim
:args *.txt
:argdo %s/\r//g | update

Эта команда обрабатывает все файлы с расширением .txt в текущем каталоге, удаляя символы ^M из каждого из них.

Использование внешних команд в пакетном режиме:

vim
:!find . -name "*.txt" -exec dos2unix {} \;

Эта команда ищет все файлы .txt в текущем каталоге и подкаталогах и применяет к каждому dos2unix.

Профилактика и настройка

Чтобы избежать подобных проблем в будущем, можно настроить окружение разработки:

Настройка Git для кроссплатформенной разработки:

bash
git config --global core.autocrlf true

Это заставит Git автоматически преобразовывать окончания строк при коммите и извлечении файлов.

Настройка Vim для автоматического определения формата файла:

Добавьте в ваш .vimrc:

vim
autocmd BufReadPost * if &fileformat == "dos" | setlocal fileformat=unix | endif

Это автоматически преобразует файлы DOS в Unix при открытии в Vim.

Установка формата файла по умолчанию:

vim
set fileformat=unix

Добавьте это в ваш .vimrc, чтобы Unix был форматом по умолчанию для всех новых файлов.

Проверка

После конвертации можно проверить окончания строк:

В Vim, отображение окончаний строк:

vim
:set list

Это покажет специальные символы, включая окончания строк. Вы должны увидеть только $ в конце строк, а не ^M$.

С помощью команд ex:

vim
:verbose set fileformat?

С помощью команд оболочки:

vim
:!file %

Или проверить конкретные символы:

vim
:/%\r/

Эта команда ищет любые оставшиеся символы возврата каретки в файле.

Согласно документации Wikipedia о переводах строк, можно также использовать команды grep для проверки окончаний строк:

bash
egrep -l '\r\n' filename.txt  # Показывает файлы в стиле DOS (CRLF)
egrep -L '\r\n' filename.txt  # Показывает файлы в стиле Unix (только LF)

Эти методы эффективно выявляют и обрабатывают различные форматы окончаний строк на разных платформах.

Заключение

Преобразование окончаний строк Windows в формат Linux в Vim простое и доступно несколькими подходами:

  1. Используйте :set fileformat=unix – самый элегантный встроенный способ.
  2. Поиск и замена :%s/^M//g – если нужно явно увидеть и удалить ^M.
  3. Внешние команды (dos2unix, sed, tr) – для более сложных операций.
  4. Настройка окружения – чтобы предотвратить будущие проблемы с Git и Vim.

Для большинства случаев :set fileformat=unix и последующее :w – самый простой и надёжный метод. Он автоматически обрабатывает конвертацию без необходимости видеть или манипулировать отдельными символами.

Помните, что правильное управление окончаниями строк критично для кроссплатформенной разработки, поскольку разные операционные системы используют разные соглашения, и их смешивание может вызвать проблемы с скриптами, системами контроля версий и утилитами обработки текста.

Источники

  1. Converting Windows Text to Linux Format - Rost Glukhov
  2. Format Line Endings - dos2unix Converter | Hexmos
  3. Newline - Wikipedia
  4. Line Endings on MacOS, Linux and Windows - Medium
Авторы
Проверено модерацией
Модерация