Как определить конец строки файла
-
02-07-2019 - |
Вопрос
У меня есть куча (сотни) файлов, которые должны иметь окончания строк 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.