缩进Bash脚本输出

时间:2009-11-03 22:32:43

标签: git bash scripting indentation

我正在尝试编写一个bash脚本,但我很难让输出看起来整洁有序。我可以使用换行符,但我宁愿让输出易于阅读。例如,当我运行git clone ...时,我想首先回显“克隆存储库”,然后输出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/。我非常感谢任何评论。

5 个答案:

答案 0 :(得分:42)

管道穿透

sed "s/^/    /g"

这将用行开始的(零宽度)锚替换四个空格,在行的开头有效地添加四个空格。

(g在全球范围内执行此操作;没有它,它只执行一次,这将执行第一行。)

答案 1 :(得分:5)

您可以通过sed过滤要缩进的命令的输出。

/tmp/test>cat script
#!/bin/sh

echo "Running ls -l"
ls -l 2>&1 | sed 's/^/\t/'

/tmp/test>sh script
Running ls -l
        total 4
        -rw-rw-r-- 1 hlovdal hlovdal 55 2009-11-03 23:36 script
/tmp/test>

sed命令将用制表器替换行的开头(在第一个字符之前),即在行的最开头插入制表符。

更新为缩进stderr。

答案 2 :(得分:5)

不需要sed的其他解决方案:

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

答案 3 :(得分:5)

通过任何命令管道git输出的问题是git会检测到输出不是终端,因此它不会输出消息,因为(通常)管道整个数据没用终端字符和进度更新到不是终端的东西。

要获取进度消息,您需要向--verbose提供git clone选项。进度消息显示在stderr上,因此您可能需要管道2>&1 | ...

请注意,进度消息不会逐行显示,但是您将获得许多旨在清除同一行的终端转义码。尝试通过像sed这样的基于行的工具进行管道来缩进此输出可能会很难,如果不是不可能的话。对于可以处理无缓冲输入的程序,应该可以在输出中查找^M并立即向后添加一些空格(或选项卡),并在收到每批数据时频繁刷新。 / p>

答案 4 :(得分:2)

由于awk解决方案尚未发布:

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