在shell脚本中缩进多行输出

时间:2013-07-05 08:49:15

标签: linux bash shell

我正在尝试在我的Ubuntu Amazon EC2盒子上更改当天的消息(MOTD),这样当我进入SSH时它会显示我的一个目录的git状态。

所有默认MOTD文件的输出在每行的开头都有两个空格,因此它看起来很好地缩进,但因为我的git status输出跨越了几行,如果我在它之前做echo -n " "只缩进第一行。

知道我怎么能让它缩进每一行?

谢谢!

4 个答案:

答案 0 :(得分:84)

将其传送到sed以在每行的开头插入2个空格。

git status | sed 's/^/  /'

答案 1 :(得分:31)

根据@ Barmar的回答,这是一个更为简洁的方法:

indent() { sed 's/^/  /'; }

git status | indent
other_command | indent

答案 2 :(得分:2)

感谢@Barmar和@Marplesoft提供了一些不错的简单解决方案-这是其他人可能会喜欢的另一种变体-该函数可以使用pr来区分多少个缩进级别:

indent() {
  local indentSize=2
  local indent=1
  if [ -n "$1" ]; then indent=$1; fi
  pr -to $(($indent * $indentSize))
}

# Example usage
ls -al | indent
git status | indent 2

答案 3 :(得分:0)

这是我编写的一个函数,用于缩进 stderr:

function indented {
  local PIPE_DIRECTORY=$(mktemp -d)
  trap "rm -rf '$PIPE_DIRECTORY'" EXIT

  mkfifo "$PIPE_DIRECTORY/stdout"
  mkfifo "$PIPE_DIRECTORY/stderr"

  "$@" >"$PIPE_DIRECTORY/stdout" 2>"$PIPE_DIRECTORY/stderr" &
  local CHILD_PID=$!

  sed 's/^/  /' "$PIPE_DIRECTORY/stdout" &
  sed 's/^/  /' "$PIPE_DIRECTORY/stderr" >&2 &
  wait "$CHILD_PID"
  rm -rf "$PIPE_DIRECTORY"
}

像这样使用:

indented git status
indented ls -al