繁体   English   中英

使用printf在bash中格式化多行命令输出

[英]Format multiline command output in bash using printf

我的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可能不是执行此操作的最佳工具。

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

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

谢谢你的帮助。

printf "  %-16s %s\n" "foo:" "$(bar | sed '2,$s/^/                   /g')"

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

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

x=$(ls -a); 
x=${x//$'\n'/$'\n'                    }; 
printf "   %-16s %s" "Contents:" "$x" $'\n'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM