Выполнить:
$ [ -n "$(tail -c1 infile)" ] && echo >> infile
$ sed 's/\r$\|^\r//g;s/\r/\n/g' infile | while IFS= read -r line
> do echo "$line" ; done
DOS line
second DOS
old mac line
new mac line
end\n\rreverse
linux line
new linux line
Все проблемы решены.
Описание:
Чтобы исправить отсутствие последней новой строки, используйте:
[ -n "$(tail -c1 infile)" ] && echo >> infile
Что добавит завершающую новую строку только в случае необходимости (не изменит правильный файл ).
Затем вы можете преобразовать
\r\n
(Стиль DOS )-\n
(просто удалите \r в конце строки)\n\r
(недопустимый стиль DOS? )на один\n
(удалить \r в начале строки)\r
(старый MAC-адрес )в\n
всего за один вызов (GNU )sed с:
sed 's/\r$\|^\r//g;s/\r/\n/g' infile
Если текстовый файл похож на этот тестовый файл:
$ cat infile
DOS line
second DOS
new mac line
end\n\rreverse
linux line
new linux line
no end line
$ cat -A infile
DOS line^M$
second DOS^M$
old mac line^Mnew mac line$
end\n\rreverse$
^Mlinux line$
new linux line$
no end line
$ od -An -tc infile
D O S l i n e \r \n
s e c o n d D O S \r \n
o l d m a c l i n e \r
n e w m a c l i n e \n
e n d \ n \ r r e v e r s e \n \r
l i n u x l i n e \n
n e w l i n u x l i n e \n
n o e n d l i n e
В BIOS есть параметр, который ускоряет загрузку компьютера за счет потери устаревших устройств, таких как клавиатуры. Отключите эту быструю загрузку, и она снова заработает.