Вопрос или проблема
У меня есть дерево каталогов, полное текстовых и бинарных файлов, некоторые из которых имеют разделители строк Unix (LF/\n
), некоторые – Windows (CRLF/\r\n
), а некоторые имеют поврежденные разделители строк в виде CRCR+LF
/\r\r+\n
(то есть LF предшествует более чем одному CR). Я не могу различить текстовые и бинарные файлы по расширению. Также не все текстовые файлы имеют одинаковую кодировку (хотя должны иметь). Большинство – в UTF-8, но некоторые – в UTF-16 с BOM, а некоторые, похоже, в Latin-1. Сохранять кодировки не обязательно, но сохранять содержимое без разделителей строк необходимо.
Я хочу оставить все бинарные файлы и текстовые файлы с разделителями Unix без изменений, а все файлы с CRCR+LF превратить в файлы с CRLF. Я не хочу превращать все в файлы с разделителями Unix, но если понадобится, то сделаю это.
Наконец, я подозреваю, что в некоторых поврежденных файлах есть лишний CR (разделитель строк Classic Mac). Я хочу удалить его, если он существует.
Я могу сделать это на Mac или Windows, однако все мои предыдущие попытки исправить разделители строк с помощью Powershell не увенчались успехом, хотя они и уменьшили количество лишних CR до одного. Чтобы попытаться контролировать эту проблему, я неоднократно заменял 0d0d0a
на 0d0a
в десятичном редакторе, когда находил один из этих файлов, но это быстро становится утомительным.
Для нормализации разделителей строк
Чтобы просто преобразовать все разделители строк в файле в правильные для конкретной платформы, dos2unix
и unix2dos
являются стандартными инструментами для этого, которые можно получить в подобной Unix среде, такой как WSL2 или что-то вроде Cygwin (что я лично использую).
dos2unix
преобразует все разделители строк в Windows (CRLF), а unix2dos
преобразует все разделители строк в Unix (LF). Например, чтобы преобразовать все файлы в каталоге в разделители строк Windows:
unix2dos *.*
Или просто чтобы преобразовать конкретный файл:
unix2dos file.txt
Чтобы исправить поврежденные разделители строк
Чтобы исправить редкий случай поврежденных разделителей строк, как в случае автора вопроса, поиск и замена – правильная идея, но вместо ручного использования графического бинарного редактора, правильным инструментом будет командный инструмент, который позволяет делать это программно. sed
является общепринятым инструментом Unix для поиска и замены. Кроме того, вам не нужно работать с шестнадцатеричными значениями, если вы редактируете только текстовые файлы, как было указано в вопросе.
Чтобы заменить поврежденные разделители строк \r\r\n
на \r\n
во всех файлах в текущем каталоге, сделайте резервную копию всего каталога, выполните cd /path/to/directory
, чтобы убедиться, что вы находитесь в том же каталоге, что и файлы.
Затем выполните следующую команду на WSL, Cygwin или подобном:
sed -i 's/\r\r\n/\r\n/gi; s/\n$//' *.*
Или следующую команду на Mac:
gsed -i "" 's/\r\r\n/\r\n/gi; s/\n$//' *.*
Ответ или решение
В данной статье мы разберёмся, как корректировать испорченные символы конца строки в текстовых файлах в директории и поддиректориях на платформах Linux, Mac и Windows. Проблема заключается в том, что у нас есть как текстовые, так и бинарные файлы, которые содержат различные форматы конца строки — Unix (LF), Windows (CRLF), а также испорченные форматы, такие как CRCR+LF. Основное внимание будет уделено безопасному изменению текстовых файлов, не затрагивая бинарные, и устранению лишних символов конца строки.
Шаг 1: Подготовка
Прежде всего, необходимо создать резервную копию вашего рабочего каталога. Это защитит ваши данные в случае непредвиденных изменений. Используйте команду:
cp -r /path/to/directory /path/to/backup_directory
Шаг 2: Установка необходимых инструментов
Чтобы изменять символы конца строки, мы будем использовать инструмент sed
. Если у вас его нет, вы можете установить его через пакетный менеджер вашей ОС:
- Debian/Ubuntu:
sudo apt-get install sed
- Mac (с использованием Homebrew):
brew install gnu-sed
- Windows: Вы можете использовать WSL (Windows Subsystem for Linux) или Cygwin для доступа к
sed
.
Шаг 3: Коррекция формата конца строки
Запустите следующую команду, чтобы просканировать все текстовые файлы и исправить неправильные символы конца строки. Мы будем заменять все случаи \r\r\n
на \r\n
и удалять случайные \r
в конце строк.
Для Linux и WSL:
find /path/to/directory -type f -exec sed -i 's/\r\r\n/\r\n/g; s/\r\n/\n/g; s/\r$/\n/g' {} +
Для Mac:
Если вы используете Mac с установленным gnu-sed, команда будет выглядеть так:
find /path/to/directory -type f -exec gsed -i '' 's/\r\r\n/\r\n/g; s/\r\n/\n/g; s/\r$/\n/g' {} +
Пояснение команд:
find /path/to/directory -type f
: Находит все файлы в указанной директории и её поддиректориях.-exec … {} +
: Выполняетsed
на каждом найденном файле.s/\r\r\n/\r\n/g
: Заменяет лишниеCR
передLF
на единичныйCRLF
.s/\r\n/\n/g
: Преобразует любыеCRLF
вLF
, если это было необходимо.s/\r$/\n/g
: Удаляет мертвые символыCR
в конце строк.
Заключение
Следуя указанным шагам, вы сможете эффективно привести в порядок символы конца строки в ваших текстовых файлах без риска для целостности бинарных файлов. Это обеспечит более стабильную работу ваших текстовых файлов и упростит их дальнейшую обработку. Если возникнут какие-либо сложности, не стесняйтесь обращаться за помощью в соответствующие интернет-ресурсы.
Эта процедура является надежным методом поддержания чистоты и согласованности ваших текстовых данных в различных операционных системах.