2016-10-12 47 views
2

我想打印一个具有特定字段宽度的数字,使数字右对齐,并打印一个符号指示符 - 不是在数字之前,而是在间隔之前。因此如何让printf生成“+ 123”而不是“+123”?

$ magic -123 7 
- 123 

而不是

$ magic -123 7 
    -123 

我能做到这一点与GNU的coreutils版本的printf效用?它的其他版本可能?

注:需要明确的是,该解决方案应该适用于任何领域的间距和任何值,例如:

  • 有可能是零,一个或多个空格
  • 数可能“溢出”指定的宽度
+0

只是转换输出。 –

+1

您可以添加一些样本输入和预期输出吗? – anubhava

+1

@anubhava:完成。 – einpoklum

回答

2

只需变换的输出:

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

哦,比我的稍微整齐(现在删除) – slim

+0

看到我的编辑,这是太具体 – einpoklum

+0

@einpoklum我认为这个答案给你足够的工作:做什么格式你可以用'printf'然后按摩它进一步与正则表达式。你不应该需要SO的帮助来制作一个正则表达式(例如)将............... 12345 ...转换为-12345 ...(用于演示目的的空格点) – slim

2

要直接回答你的问题,我不认为你可以在printf的GNU coreutils版本中在符号字符和数字的非零数字之间插入空格填充。 printf似乎总是将符号与未填充的数字组合在一起,在符号的左侧放置任何额外的空白填充。

0

基于@ KarolyHorvath的建议,我想这应该工作:

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

采用*在格式规范从参数采取字段宽度。

相关问题