Символы \b
изменяют текущую строку, поэтому новая строка никогда не печатается.Вы не добьетесь большого успеха из коробки, используя линейный редактор потоков, такой как sed, для такого рода ввода.
Если mkvmerge
генерирует такой вывод, то сначала попробуйте поискатьдля переключателя, который заставляет его использовать какой-либо другой индикатор прогресса (предпочтительно тот, который печатает новые строки).
Если это не сработает, вы можете попробовать заменить символы возврата на новую строку:
( echo -en "Progres: 0%" ; sleep 1 ; echo -en "\b\b25%" ; sleep 1 ; echo -en "\b\b\b50%" ; sleep 1 ;
echo -en "\b\b\b75%" ; sleep 1 ; echo -e "\b\b\b100%" ) | tr '\b' '\n'
Добавьте небуферинг, используя stdbuf
, и кажется, что мы здесь, по крайней мере, для вашего примера:
( echo -en "0%" ; sleep 1 ; echo -en "\b\b25%" ; sleep 1 ; echo -en "\b\b\b50%" ; sleep 1 ;
echo -en "\b\b\b75%" ; sleep 1 ; echo -e "\b\b\b100%" ) | stdbuf -i0 -o0 -e0 tr '\b' '\n' |
stdbuf -i0 -o0 -e0 sed -e 's/Progress: //' -e 's/%//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/'
Вывод, который появился на экране в том виде, как он был создан благодаря stdbuf
(Iобрезаны некоторые ложные символы новой строки):
0
25
50
75
100