[英]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.