2016-10-12 77 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/' 
} 

採用*在格式規範從參數採取字段寬度。

相關問題