Как определить окончание строки файла - PullRequest
51 голосов
/ 23 сентября 2008

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

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

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

Ответы [ 7 ]

68 голосов
/ 23 сентября 2008

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

28 голосов
/ 23 сентября 2008

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

egrep -l $'\r'\$ *
14 голосов
/ 14 января 2010

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

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

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

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

4 голосов
/ 16 июня 2016

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

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

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

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

0 голосов
/ 09 мая 2015

Когда вы знаете, какие файлы имеют окончания строки 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.

0 голосов
/ 23 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...