git - 特殊文字 - シェルスクリプト 変数




Bashスクリプトの出力をインデントする (4)

awkソリューションはまだ投稿されていないので:

$ echo -en "hello\nworld\n"
hello
world
$ echo -en "hello\nworld\n" | awk '{print "    "$0}'
    hello
    world

私はbashスクリプトを書き込もうとしていますが、出力をきれいに整理することができません。 単に改行を使用することに頼ることができましたが、私はもっと読みやすい出力を得たいと思います。 たとえば、 git clone ...を実行すると、まず "Cloning repository"とエコーしてから、 gitの出力をインデントします。 出力例

Cloning repository...
    Initialized empty Git repository in /root/client_scripts/jojo/.git/
    remote: Counting objects: 130, done.
    remote: Compressing objects: 100% (121/121), done.
    remote: Total 130 (delta 13), reused 113 (delta 6)
    Receiving objects: 100% (130/130), 176.07 KiB, done.
    Resolving deltas: 100% (13/13), done.

現在のところ、すべてインデントなしで圧縮されています。 誰もがこれを行う方法を知っていますか? sedawk Initialized empty Git repository in /root/client_scripts/jojo/.git/ましたがInitialized empty Git repository in /root/client_scripts/jojo/.git/以外の出力は表示されませんInitialized empty Git repository in /root/client_scripts/jojo/.git/ 。 コメントをいただければ幸いです。


gitの出力を任意のコマンドでパイプ処理することに伴う問題は、gitが出力が端末ではないことを検出するため、進行メッセージであるメッセージを出力しないことです。進行状況は端末ではないものに更新されます。

とにかく進捗メッセージを取得するには、 git clone --verboseオプションを提供する必要があります。 進捗メッセージがstderr表示されるので、 2>&1 | ...ようなパイプが必要になるでしょう2>&1 | ... 2>&1 | ...

進捗メッセージは1行ずつ表示されませんが、同じ行を消去するように設計されている端末エスケープコードがたくさんあります。 sedのようなラインベースのツールを介してこの出力をインデントしようとするのは、不可能ではないにしても、難しいと思われるでしょう。 バッファリングされていない入力を処理できるプログラムの場合、出力の^Mを探してすぐ後ろにスペース(またはタブ)を追加して、データの各バッチを受け取るたびにフラッシュすることがかなり可能です。


sedを必要としない別の解決策:

command | (while read; do echo "    $REPLY"; done)

パイプスルー

sed "s/^/    /g"

これは、行の先頭の(幅がゼロの)アンカーを4つのスペースで置き換え、行の先頭に事実上4つのスペースを追加します。

(gはグローバルにこれを行います;それがなければ、それは一度だけそれをするでしょう、そしてそれは最初の行をするでしょう。)





indentation