使用sed(或其他工具)解析进度

3

我正在尝试解析一个程序中的进度(它是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%" 

我想要得到数字而不包含“Progress”和“%”。这个可以实现:
echo -e "Progress: 0%"| sed -e 's/Progress: //' -e 's/%//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/'

但是当进度不断变化时,这种方法就行不通了。有没有其他方法可以实现(即使没有sed)?


是的,我认为这会很难,但是 Eduardo 很快就有了答案:-)。 - sup
2个回答

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

非常感谢,我自己肯定无法弄明白这个:-)最终结果是这样的命令: mkvmerge -o "out.mkv" --language 0:eng --forced-track 0:no --language 1:eng --forced-track 1:no -a 1 -d 0 -S -T --no-global-tags --no-chapters "path_to_movie.avi" --track-order 0:0,0:1 | stdbuf -i0 -o0 -e0 tr '\r' '\n' | stdbuf -i0 -o0 -e0 grep 'Progress:' | stdbuf -i0 -e0 -o0 sed -e 's/Progress: //' -e 's/%//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/' | zenity --width=480 --progress --auto-close --percentage=0 --text="Bla" --title="Merging subtitles with video, please wait..." - sup

3

尝试使用tr命令进行管道传输,将回车符(最可能的是正在使用的符号)转换为换行符:

<cmd> | tr '\r' '\n' | sed ...

然后,您可以像通常一样将其分成行并进行处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接