2012-03-14 7 views
3

私は1つのプログラム(それははmkvmergeですが、私はそれは問題ではありません願っています)から進捗状況を解析しようとしています:SED(または他の何か)と解析の進捗状況

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%" 

私はせずに番号を取得したいと思います"進捗状況"と "%"。これは動作します:

​​

しかし、進捗状況が変わっても動作しません。それを行う方法はありますか(sedなしで、何か他のものでさえ)?

+0

ええ、これはかなり難しいと思っていましたが、エドゥアルドはすぐに回答を得ました:-)。 – sup

答えて

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 
+0

ありがとう、私は自分自身でこれを決して理解しません:-)。結局、この獣は次のようになります: 'mkvmerge -o" out.mkv " - language 0:eng --forced-track 0:いいえ--language 1:eng --forced-track 1:no -a 1 -d 0 -S -T --no-global-tags - 章なし "path_to_movie.avi" - トラックオーダー0:0,0:1 | stdbuf -i0 -o0 -e0 tr '\ r' '\ n' | stdbuf -i0 -o0 -e0 grep 'Progress:' | stdbuf -i0 -e0 -o0 sed -e/Progress:// '-e' /%// '-e' s/\(.... \)\(.. \)\(.. \)/ \ 1- \ 2- \ 3/'| ==================================================================================================================================================== - – sup

3

ラインに(ほとんどの場合、それが使用しているもの)キャリッジリターンをオンにするtr通じてみ配管フィード:

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

次に、あなたはそれで作業することができますが、通常どおりのような行に分離しました。

関連する問題