在shell脚本中缩进多行输出

Mat*_*her 59 linux bash shell

我正在尝试在我的Ubuntu Amazon EC2盒子上更改当天的消息(MOTD),以便在我SSH时它将显示我的一个目录的git状态.

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

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

谢谢!

Bar*_*mar 95

将其管道以sed在每行的开头插入2个空格.

git status | sed 's/^/  /'
Run Code Online (Sandbox Code Playgroud)

  • @cglacet 在脚本的第二行中指定 `set -euo pipelinefail` 将为您测试它。 (2认同)

Mar*_*oft 34

在@ Barmar的回答基础上,这是一个更为简洁的方法:

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

git status | indent
other_command | indent
Run Code Online (Sandbox Code Playgroud)

  • @MattFletcher:嗯,我认为用这样的子程序编写代码可以让非 bash 教授(比如我自己)更容易弄清楚发生了什么。此外,如果您决定突然想要有 3 个而不是 2 个空格,那么您只有一个地方需要更正。 (3认同)
  • 请记住,我提供了一个备用代码段.如果没有代码格式,那么在评论中描述这并不理想.如果我只是提供一两句关于现有答案的评论,而这些评论在我看来更适合作为评论. (3认同)
  • 并没有真正增加太多,它是 shell 脚本中的一个用例,所以 bash 子例程有点矫枉过正,但是谢谢 (2认同)
  • @Vering这是真的,我确实理解这样做的好处,我只是更多地暗示它可能是一个评论而不是一个答案本身,因为它几乎是相同的答案,并解决了一个从未提出过的问题.第一名 :) (2认同)
  • @ChristianHerenz 尝试 `indent() { sed "s/^/$(printf "%$1s")/"; }`。例如 `indent 4` 产生 4 个空格。非常简洁,也可以在纯 shell 中工作。 (2认同)

Oli*_*gey 12

感谢@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
Run Code Online (Sandbox Code Playgroud)

  • 好答案。FWIW,“$”在 ((...)) 中是不必要的。请参阅 https://github.com/koalaman/shellcheck/wiki/SC2004 (2认同)