Ответ 1
Вы можете использовать grep
egrep -l $'\r'\$ *
У меня есть куча (сотни) файлов, которые должны иметь окончание строк Unix. Я сильно подозреваю, что некоторые из них имеют окончание строк Windows, и я хочу программно выяснить, какие из них делать.
Я знаю, что могу просто запустить
flip -uили что-то подобное в script для преобразования всего, но я хочу, чтобы иметь возможность идентифицировать те файлы, которые нужно изменить в первую очередь.
Вы можете использовать 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 $1 }'
file
для поиска типа файла. Те, у кого CRLF, имеют обратные символы Windows. Вывод file
разделяется символом :
, а первое поле - это путь к файлу.Unix использует один байт, 0x0A (LineFeed), а окна используют два байта, 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 (0x0A
или \n
). Вы можете конвертировать файл с окончанием строки Windows в конец строки Unix с помощью утилиты sed
, просто используйте команду:
$> sed -i 's/\r//' my_file_with_win_line_endings.txt
Вы можете поместить его в script следующим образом:
#!/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.