用sed(或其他东西)解析进度

时间:2012-03-14 17:59:05

标签: bash parsing 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%" 

我想获得没有“进度”和“%”的数字。这有效:

echo -e "Progress: 0%"| sed -e 's/Progress: //' -e 's/%//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/'

但是当进步不断变化时,它不起作用。有没有办法做到这一点(即使没有sed和其他东西)?

2 个答案:

答案 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 ...

然后你就可以像往常那样将它分成几行。