Пуленепробиваемое решение. Безопасный для двоичных данных и POSIX-совместимый, но медленный.
POSIX sed
требует ввода в соответствии с
POSIX текстовый файл
а также
линия POSIX
определения, поэтому NULL-байты и слишком длинные строки не допускаются, и каждая строка должна заканчиваться символом новой строки (включая последнюю строку). Это затрудняет использование sed для обработки произвольных входных данных.
Следующее решение исключает sed и вместо этого преобразует входные байты в восьмеричные коды, а затем снова в байты, но перехватывает восьмеричный код 012 (новая строка) и выводит строку замены вместо нее. Насколько я могу судить, решение совместимо с POSIX, поэтому оно должно работать на самых разных платформах.
od -A n -t o1 -v | tr ' \t' '\n\n' | grep . |
while read x; do [ "0$x" -eq 012 ] && printf '<br>\n' || printf "\\$x"; done
Справочная документация POSIX:
ш ,
командный язык оболочки ,
от ,
тр ,
Grep ,
прочитать ,
[,
Printf .
Оба read
, [
и printf
являются встроенными по крайней мере в bash, но это, вероятно, не гарантируется POSIX, поэтому на некоторых платформах может случиться так, что каждый входной байт будет начинать один или несколько новые процессы, которые будут тормозить вещи. Даже в bash это решение достигает только 50 кБ / с, поэтому оно не подходит для больших файлов.
Протестировано на Ubuntu (bash, dash и busybox), FreeBSD и OpenBSD.