【问题标题】:How can I get printf to produce "+ 123" instead of " +123"?如何让 printf 产生“+ 123”而不是“+123”?
【发布时间】:2016-10-12 15:33:43
【问题描述】:

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

$ magic -123 7 
-   123

而不是

$ magic -123 7 
   -123

我可以使用 GNU coreutils 版本的 printf 实用程序来做到这一点吗?也许是其他版本?

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

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

【问题讨论】:

  • 只是转换输出。
  • 您能否在您的预期输出中添加一些示例输入?
  • 特别是。 magic -123567 4 的输出应该是什么?
  • @anubhava:显然没有空格,只有-123567;唯一的变化是放置空格的位置。

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


【解决方案1】:

只需转换输出:

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

【讨论】:

  • 哦,比我的稍微整洁(现已删除)
  • @einpoklum 我认为这个答案足以让您使用:使用printf 进行您可以使用的格式,然后使用正则表达式进一步按摩它。您不应该需要 SO 的帮助来制作一个正则表达式(例如)将 .....-12345... 转换为 -.....12345...(用于演示目的的空格点)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以像这样使用纯 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
    

    【讨论】:

      【解决方案4】:

      根据@KarolyHorvath 的建议,我想这应该可行:

      printf "%+7d" 123 | sed -r 's/^( *)([+-])/\2\1/'
      

      【讨论】:

        【解决方案5】:
        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/'
        }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          • 2016-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多