Shell 我怎样才能让printf生产+;123“;而不是",+;123";?

Shell 我怎样才能让printf生产+;123“;而不是",+;123";?,shell,printf,sign,gnu-coreutils,format-string,Shell,Printf,Sign,Gnu Coreutils,Format String,我想为数字打印一个具有特定字段宽度的数字,使数字右对齐,并打印一个符号指示器-不是在数字之前,而是在间距之前。因此 $ magic -123 7 - 123 而不是 $ magic -123 7 -123 我可以用GNUCoreutils版本的printf实用程序来实现这一点吗?也许还有其他版本 注意:为了清楚起见,解决方案应适用于任何字段间距和任何值,例如: 可能有零个、一个或多个空格 该数字可能会“溢出”指定的宽度 只需转换输出: printf %+d 12 | sed

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

$ magic -123 7 
-   123
而不是

$ magic -123 7 
   -123
我可以用GNUCoreutils版本的printf实用程序来实现这一点吗?也许还有其他版本

注意:为了清楚起见,解决方案应适用于任何字段间距和任何值,例如:

  • 可能有零个、一个或多个空格
  • 该数字可能会“溢出”指定的宽度

只需转换输出:

printf %+d 12 | sed 's/[+-]/\0 /'
+ 12

为了直接回答您的问题,我不相信您可以使用GNU coreutils版本的
printf
,在符号字符和数字的非零数字之间插入空格填充
printf
似乎总是将符号与未添加的数字分组,在符号的左侧放置任何额外的空格填充。

根据@KarolyHorvath的建议,我认为这应该有效:

printf "%+7d" 123 | sed -r 's/^( *)([+-])/\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

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

只需转换输出。您可以在预期输出中添加一些示例输入吗?特别是
magic-123567 4
的输出应该是什么?@anubhava:显然没有空格,只需
-123567
;唯一的变化是空格的放置位置。哦,比我的(现在已删除)稍微整洁一点@einpoklum我想这个答案足以让你使用:使用
printf
做你能做的格式化,然后用正则表达式进一步按摩它。您不需要SO的帮助就可以创建一个正则表达式,该正则表达式可以(例如)将
..-12345…
转换为
-..12345…
(用于演示的空格点)
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/'
}