如何让printf生产" + 123"而不是" + 123&#34 ;?

时间:2016-10-12 15:33:44

标签: shell printf sign gnu-coreutils format-string

我想打印一个具有一定字段宽度的数字,数字右对齐,并打印一个符号指示符 - 不是在数字之前,而是在间距之前。因此

$ magic -123 7 
-   123

而不是

$ magic -123 7 
   -123

我可以使用printf实用程序的GNU coreutils版本吗?它的其他版本可能吗?

注意:要明确,解决方案应适用于任何字段间距和任何值,例如:

  • 可能有零个,一个或多个空格
  • 这个数字可能会溢出"指定的宽度

5 个答案:

答案 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/'
}

使用格式规范中的*从参数中获取字段宽度。