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?

bash 

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.


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

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

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}"

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

Beachten Sie Abstände und Backticks


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.


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  

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.