0

在 Bash 中,我可以printf像这样格式化字符串输出:- (请注意我如何W在字符串中添加后缀,并且这不包含在填充中)

$ printf "Blah %11.1fW\n" 123 456 78965 5 56
Blah       123.0W
Blah       456.0W
Blah     78965.0W
Blah         5.0W
Blah        56.0W

如果我想为字符串添加前缀,我可以这样做:-

$ printf "Blah £%11.1f\n" 123 456 78965 5 56
Blah £      123.0
Blah £      456.0
Blah £    78965.0
Blah £        5.0
Blah £       56.0

但是请注意这如何导致在前缀之前应用填充。

我将如何(如果可能的话)printf在填充之前为值添加前缀,以便输出如下:-

Blah      £ 123.0
Blah      £ 456.0
Blah    £ 78965.0
Blah        £ 5.0
Blah       £ 56.0

如果不可能,任何 Bash 解决方案都是合适的。

4

3 回答 3

4

我想出了这个:

$ printf "Rate: %11s\n" $(printf "$%.1f " 12345 123)
Rate:    $12345.0
Rate:      $123.0

只要确保%11s为您的情况选择正确的。


看来你自己解决了这个空间问题。为了完整起见,我将把它放在这里。

$ printf "Rate: %11s\n" $(printf "$%.1f " 12345 123) | sed 's/\$/\$ /g'
Rate:    $ 12345.0
Rate:      $ 123.0

这是@FatalError 给出的解决方案:

printf "Rate: %11b\n" $(printf '$\\0040%.1f ' 12345 123)
Rate:   $ 12345.0
Rate:     $ 123.0
于 2012-07-05T10:36:02.577 回答
3

不可能。你需要类似的东西strfmon。解决方法:

$ a=(123 456 78965 5 56)
$ printf 'blah %*s %.1f\n' {,,,,}{$((10 - ${#a[n]})),£,"${a[n++]}"}
blah      £ 123.0
blah      £ 456.0
blah    £ 78965.0
blah        £ 5.0
blah       £ 56.0
于 2012-07-05T11:16:32.403 回答
2

虽然我喜欢 ormaaj 将东西保存在 shell 中的解决方案,但我不喜欢使用子 shell,除非我真的需要它们。一条既有子壳又有管道的线似乎……没有必要。

$ printf "Rate: %11.1f\n" 123 | sed 's/  \([0-9]\)/$ \1/'
Rate:     $ 123.0
于 2012-07-06T10:58:29.967 回答