Padding zeros in a string

Bash

Bash Problem Overview


I'm writing a bash script to get some podcasts. The problem is that some of the podcast numbers are one digits while others are two/three digits, therefore I need to pad them to make them all 3 digits.

I tried the following:

n=1

n = printf %03d $n

wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3

but the variable 'n' doesn't stay padded permanently. How can I make it permanent?

Bash Solutions


Solution 1 - Bash

Use backticks to assign the result of the printf command (``):

n=1
wget http://aolradio.podcast.aol.com/sn/SN-`printf %03d $n`.mp3

EDIT: Note that i removed one line which was not really necessary. If you want to assign the output of 'printf %...' to n, you could use

n=`printf %03d $n`

and after that, use the $n variable substitution you used before.

Solution 2 - Bash

Seems you're assigning the return value of the printf command (which is its exit code), you want to assign the output of printf.

bash-3.2$ n=1
bash-3.2$ n=$(printf %03d $n)
bash-3.2$ echo $n
001

Solution 3 - Bash

Attention though if your input string has a leading zero!
printf will still do the padding, but also convert your string to hex octal format.

# looks ok
$ echo `printf "%05d" 03`
00003

# but not for numbers over 8
$ echo `printf "%05d" 033`
00027

A solution to this seems to be printing a float instead of decimal.
The trick is omitting the decimal places with .0f.

# works with leading zero
$ echo `printf "%05.0f" 033`
00033

# as well as without
$ echo `printf "%05.0f" 33`
00033

Solution 4 - Bash

to avoid context switching:

a="123"
b="00000${a}"
c="${b: -5}"

Solution 5 - Bash

n=`printf '%03d' "2"`

Note spacing and backticks

Solution 6 - Bash

As mentioned by noselad, please command substitution, i.e. $(...), is preferable as it supercedes backtics, i.e. `...`.

Much easier to work with when trying to nest several command substitutions instead of escaping, i.e. "backslashing", backtics.

Solution 7 - Bash

This is in response to an answer given by cC Xx. It will work only until a's value less is than 5 digits.

Consider when a=12345678. It'll truncate the leading digits:

a="12345678" 
b="00000${a}" 
c="${b: -5}" 
echo "$a, $b, $c"

This gives the following output:

12345678, 0000012345678, 45678

Putting an if to check value of a is less than 5 digits and then doing it could be solution:

if [[ $a -lt 9999 ]] ; then b="00000${a}" ; c="${b: -5}" ;  else c=$a; fi  

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbaxterView Question on Stackoverflow
Solution 1 - BashChristopheDView Answer on Stackoverflow
Solution 2 - BashnosView Answer on Stackoverflow
Solution 3 - BashUnSandpiperView Answer on Stackoverflow
Solution 4 - BashcC XxView Answer on Stackoverflow
Solution 5 - BashanonView Answer on Stackoverflow
Solution 6 - BashRob WellsView Answer on Stackoverflow
Solution 7 - BashSivaView Answer on Stackoverflow