Вопрос

У меня есть куча (сотни) файлов, которые должны иметь окончания строк Unix.Я сильно подозреваю, что у некоторых из них есть окончания строк Windows, и я хочу программно выяснить, какие из них есть.

Я знаю, что могу просто бежать

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

Это было полезно?

Решение

Вы можете использовать grep

egrep -l $'\r'\$ *

Другие советы

Вы можете использовать file инструмент, который сообщит вам тип окончания строки.Или вы можете просто использовать dos2unix -U который преобразует все в окончания строк Unix, независимо от того, с чего оно началось.

Что-то вроде:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

хотя некоторые из этих регулярных выражений, возможно, нуждаются в уточнении и приведении в порядок.

В результате ваш файл будет содержать WIN, MAC или UNIX в конце каждой строки.Хорошо, если ваш файл представляет собой ужасный беспорядок (или разницу) и имеет смешанные окончания.

Вот самый безотказный ответ.Ответ Стимма не учитывает подкаталоги и двоичные файлы.

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • Использовать file чтобы найти тип файла.Те, у кого есть CRLF, имеют символы возврата Windows.Выход file ограничен :, а первое поле — это путь к файлу.

Unix использует один байт, 0x0A (перевод строки), а Windows использует два байта, 0x0D 0x0A (возврат каретки, перевод строки).

Если вы никогда не видите 0x0D, то, скорее всего, это Unix.Если вы видите пары 0x0D 0x0A, то, скорее всего, это MSDOS.

Windows использует символы 13 и 10 для окончания строки, Unix только один из них (я не помню какой).Таким образом, вы можете заменить символы 13 и 10 на символы 13 или 10 (тот, который использует unix).

Когда вы знаете, какие файлы имеют окончания строк Windows (0x0D 0x0A или \r \n), что вы будете делать с этими файлами?Полагаю, вы преобразуете их в концы строк Unix (0x0A или \n).Вы можете преобразовать файл с окончаниями строк Windows в окончания строк Unix с помощью sed утилита, просто используйте команду:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

Вы можете поместить это в скрипт следующим образом:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

Если вы запустите его из корневого каталога с файлами, в конце вы будете уверены, что все файлы имеют окончания строк Unix.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top