我想打印一个具有一定字段宽度的数字,数字右对齐,并打印一个符号指示符 - 不是在数字之前,而是在间距之前。因此
$ magic -123 7
- 123
而不是
$ magic -123 7
-123
我可以使用printf实用程序的GNU coreutils版本吗?它的其他版本可能吗?
注意:要明确,解决方案应适用于任何字段间距和任何值,例如:
答案 0 :(得分:2)
简单地转换输出:
printf %+d 12 | sed 's/[+-]/\0 /'
+ 12
答案 1 :(得分:2)
要直接回答您的问题,我不相信您可以使用['Text']
的GNU coreutils版本在符号字符和数字的非零数字之间插入空格填充。 printf
似乎始终使用未填充的数字对标记进行分组,在标记的左侧放置任何额外的空格填充。
答案 2 :(得分:1)
您可以使用纯shell实用程序来使用名为magic
的函数:
magic() {
# some sanity checks to make sure you get $1 and $2
[[ $2 -lt 0 ]] && printf "-" || printf "+"
printf "%${1}s\n" "${2#[+-]}"
}
现在将其用作:
$> magic 5 120
+ 120
$> magic 5 120234
+120234
$> magic 5 -120234
-120234
$> magic 5 -120
- 120
$> magic 5 1
+ 1
$> magic 5 +120
+ 120
答案 3 :(得分:0)
根据@ KarolyHorvath的建议,我认为这应该有效:
printf "%+7d" 123 | sed -r 's/^( *)([+-])/\2\1/'
答案 4 :(得分:0)
magic () {
local sign="+" number=$1 width=$2
if ((number < 0)); then
sign="-"
((number *= -1))
fi
printf '%s%*d\n' "$sign" "$((width - 1))" "$number"
}
或
magic () {
printf '%+*d\n' "$2" "$1" | sed -r 's/^( *)([+-])/\2\1/'
}
使用格式规范中的*
从参数中获取字段宽度。