我正在尝试解析一个程序的进度(它是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%"
我想获得没有“进度”和“%”的数字。这有效:
echo -e "Progress: 0%"| sed -e 's/Progress: //' -e 's/%//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/'
但是当进步不断变化时,它不起作用。有没有办法做到这一点(即使没有sed和其他东西)?
答案 0 :(得分:3)
\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
(我修剪了一些虚假的换行符)而出现在屏幕上:
0
25
50
75
100
答案 1 :(得分:3)
尝试通过tr
滚动来将回车(很可能是它正在使用的)转换为换行符:
<cmd> | tr '\r' '\n' | sed ...
然后你就可以像往常那样将它分成几行。