Auffüllen von Nullen in einer Zeichenfolge

74

Ich schreibe ein Bash-Skript, um Podcasts zu erhalten. Das Problem ist, dass einige der Podcast-Nummern einstellig sind, während andere zwei- oder dreistellig sind. Daher muss ich sie auffüllen, damit sie alle drei Stellen haben.

Ich habe folgendes versucht:

n=1

n = printf %03d $n

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

Die Variable 'n' bleibt jedoch nicht dauerhaft aufgefüllt. Wie kann ich es dauerhaft machen?


quelle

Antworten:

100

Verwenden Sie Backticks, um das Ergebnis des Befehls printf (``) zuzuweisen:

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

EDIT: Beachten Sie, dass ich eine Zeile entfernt habe, die nicht wirklich notwendig war. Wenn Sie die Ausgabe von 'printf% ...' n zuweisen möchten, können Sie verwenden

n=`printf %03d $n`

Verwenden Sie danach die zuvor verwendete Variablensubstitution $ n.

ChristopheD
quelle
5
Warum nicht : wget $(printf http://aolradio.podcast.aol.com/sn/SN-%03d $n.mp3, $n). Fügen Sie einfach die gesamte URL in die printfAnweisung ein.
David W.
Was ist, wenn Sie tatsächlich eine Zeichenfolge auffüllen müssen? Zum Beispiel habe ich die Zeichenfolge "Hallo", aber ich muss immer 10 Zeichen drucken. Ich muss die Zeichenfolge drucken: "----- Hallo" oder wenn ich "Ja" habe, werden immer noch 10 Zeichen gedruckt als: "------- ja"
m4l490n
41

Anscheinend weisen Sie den Rückgabewert des Befehls printf zu (dies ist der Exit-Code). Sie möchten die Ausgabe von printf zuweisen.

bash-3.2$ n=1
bash-3.2$ n=$(printf %03d $n)
bash-3.2$ echo $n
001
nr
quelle
2
Warum ist $ () vorzuziehen?
bli
3
@bli Es kann verschachtelt werden, während Backticks nicht können (zumindest nicht ohne irgendeine Form der Flucht)
Neil
19

Achtung, wenn Ihre Eingabezeichenfolge eine führende Null hat!
printf übernimmt weiterhin das Auffüllen, konvertiert aber auch Ihre Zeichenfolge in das hexadezimale Oktalformat.

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

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

Eine Lösung hierfür scheint das Drucken eines Gleitkommas anstelle einer Dezimalzahl zu sein.
Der Trick besteht darin, die Dezimalstellen mit wegzulassen .0f.

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

# as well as without
$ echo `printf "%05.0f" 33`
00033
UnSandpiper
quelle
2
Das liegt daran, dass printf "0n" als Oktal nimmt. Oktal 33 = Dezimal 27. Nicht hex.
cde
13

um Kontextwechsel zu vermeiden:

a="123"
b="00000${a}"
c="${b: -5}"
cC Xx
quelle
4
n=`printf '%03d' "2"`

Beachten Sie Abstände und Backticks


quelle
3

Wie von noselad erwähnt, ist die Befehlsersetzung, dh $ (...), vorzuziehen, da sie Backtics ersetzt, d `...`. H.

Es ist viel einfacher, damit zu arbeiten, wenn Sie versuchen, mehrere Befehlsersetzungen zu verschachteln, anstatt zu entkommen, dh "Backslashing" - Backtics.

Rob Wells
quelle
0

Dies ist eine Antwort auf eine Antwort von cC Xx. Es funktioniert nur, bis ader Wert kleiner als 5 Stellen ist.

Überlegen Sie wann a=12345678. Die führenden Ziffern werden abgeschnitten:

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

Dies ergibt die folgende Ausgabe:

12345678, 0000012345678, 45678

Das Setzen eines ifzu überprüfenden Werts von aist weniger als 5 Stellen und dann könnte es eine Lösung sein:

if [[ $a -lt 9999 ]] ; then b="00000${a}" ; c="${b: -5}" ;  else c=$a; fi  
Siva
quelle
Das Setzen eines if-zu überprüfenden Werts von a ist weniger als 5 Stellen und dann könnte es eine Lösung sein.
Siva