Search code examples
bashprintfcharacter

Bash printf format for Eszett (scharfes S, sharp s) takes up 2 positions


I want to use printf under bash to format german verbs as follows:

INFINITIV       PRATERITUM      PERFEKT         3.PERS. SING
heißen          hieß            hat geheißen    er heißt
kaufen          kaufte          hat gekauft     er kauft

I use a simple printf commando in my bash script:

printf "%-15s %-15s %-15s %-15s %-15s\n" "INFINITIV" "PRATERITUM" "PERFEKT" "3.PERS. SING"
printf "%-15s %-15s %-15s %-15s %-15s\n" "heißen" "hieß" "hat geheißen" "er heißt"
printf "%-15s %-15s %-15s %-15s %-15s\n" "kaufen" "kaufte" "hat gekauft" "er kauft"

But is seems that the Eszett is seen as two characters. Therefore on the screen after every ß the text shifts one position to the left. The output is:

pwp@linuxcomputers:~/Scripts/Test$ Deutsche-Verben-Scharf-S 
INFINITIV       PRATERITUM      PERFEKT         3.PERS. SING                   
heißen         hieß           hat geheißen   er heißt                      
kaufen          kaufte          hat gekauft     er kauft

How can I prevent this shift and make the printf formatting do what it is intended to do?


Solution

  • With a function to pad your strings at the end:

    pad() {
      local string="$1              "
      echo "${string:0:15}"
    }
    
    printf "%s %s %s %s\n" "$(pad "INFINITIV")" "$(pad "PRATERITUM")" "$(pad "PERFEKT")" "$(pad "3.PERS. SING")"
    printf "%s %s %s %s\n" "$(pad "heißen")" "$(pad "hieß")" "$(pad "hat geheißen")" "$(pad "er heißt")"
    printf "%s %s %s %s\n" "$(pad "kaufen")" "$(pad "kaufte")" "$(pad "hat gekauft")" "$(pad "er kauft")"
    

    Output:

    INFINITIV       PRATERITUM      PERFEKT         3.PERS. SING   
    heißen          hieß            hat geheißen    er heißt       
    kaufen          kaufte          hat gekauft     er kauft