Как определить окончание строки файла

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

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

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

7 ответов


вы можете использовать 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 в конце каждой строки. Хорошо, если ваш файл каким-то образом ужасный беспорядок (или diff) и имеет смешанные окончания.


вот самый надежный ответ. Ответ Stimms не учитывает подкаталоги и двоичные файлы

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

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

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


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


когда вы знаете, какие файлы имеют окончания строк Windows (0x0D 0x0A или \r \n), что вы будете делать с файлами? Я предполагаю, вы преобразуете их в Unix line ends (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 окончания.