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