Как определить окончание строки файла
У меня есть куча (сотни) файлов, которые должны иметь окончания строк в Unix. Я сильно подозреваю, что некоторые из них имеют окончания строк Windows, и я хочу программно выяснить, какие из них делают.
Я знаю, что могу просто запустить
flip -uили что-то подобное в скрипте для преобразования всего, но я хочу иметь возможность идентифицировать те файлы, которые нужно изменить в первую очередь.
7 ответов
можно использовать 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 окончания.