Исправить поврежденные окончания строк в директории рекурсивно только в текстовых файлах (Linux, Mac или Windows)

Вопрос или проблема

У меня есть дерево каталогов, полное текстовых и бинарных файлов, некоторые из которых имеют разделители строк 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 в конце строк.

Заключение

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

Эта процедура является надежным методом поддержания чистоты и согласованности ваших текстовых данных в различных операционных системах.

Оцените материал
Добавить комментарий

Капча загружается...