1

我的 Bash 脚本用于printf打印应用格式的其他一些命令的输出,方式如下(注意两个前导空格):

printf "  %-16s %s\n" "foo:" "$(bar)"

两个前导空格在那里,因为文件中的第一行是注释,我喜欢保持对齐:

# foo
  foo:            bar
  foo:            bar
  ...

这对于具有单行输出的命令非常有效。但是,当输出是多行时,输出会丢失后续行的格式。

例如:

printf "  %-16s %s\n" "Contents:" "$(ls -a)"

结果是这样的:

  Contents:       .
..
foo
bar

相反,我想要实现的是多行输出,每行都被格式化(如果你喜欢,在列中),看起来像这样(注意后续行中缺少“标题”):

  Contents:       .
                  ..
                  foo
                  bar

到目前为止,我的理解是,printf使用两个参数(第一个是字符串,另一个是给定命令的结果)将第二个参数视为单个字符串,其中可以包含换行符。因此,根据我的要求,输出实际上是正确格式化的,printf但这不是我想要的。

我知道一些与解析命令输出相关的陷阱,例如ls,这耗尽了我目前解决这个问题的可能性。此外,这可能printf不是执行此操作的最佳工具。

如果无法解决此问题,我正在考虑将多行字符串替换为逗号分隔列表,但这将是最后的手段。

实现我需要的格式的最佳方法是什么?

谢谢你的帮助。

4

2 回答 2

1
printf "  %-16s %s\n" "foo:" "$(bar | sed '2,$s/^/                   /g')"
于 2013-05-16T09:31:10.427 回答
0

您可能会发现很难将相同的打印指令应用于一系列命令。ls 的输出也可能很繁琐,因为它根据环境变量选择输出格式。

我发现以下内容适用于我的 Mac 上的 ls:

x=$(ls -a); 
x=${x//$'\n'/$'\n'                    }; 
printf "   %-16s %s" "Contents:" "$x" $'\n'
于 2014-11-13T20:38:12.473 回答