[sed] Zahl mit führenden Nullen auffüllen

S

spacebull

Grünschnabel
Hallo Boar,

ich habe folgendes Problem:
Im Verzeichnis /var/svn befinden sich Verzeichnisse nach dem Schema "svn-000, svn-001" usw.
Ich schreiibe gerade ein Script, welches das nächste freie Verzeichniss erstellt. Also in diesem Fall svn-002. Soweit bin ich bisher:
Code:
# ls /var/svn/ | grep svn- | tail -1 | sed s/svn-//g | sed s/0*//g 
6
Nun muss ich aber die führenden Nullen da wieder hin zauber. Und da verlässt mich meine sed-Weisheit :-( Wisst ihr eventuell Rat? Also 2 soll zu 002 und 42 zu 042 werden.

Viele Grüße,
Matze
 
printf sollte Dir helfen:

Code:
[~]$ nvar=$(printf "%03d" 5)
[~]$ echo $nvar
005

Gruss, Xanti
 
sed

Ich habe hunderte Dateien in denen ich für die durchnummerierten Geräte mit einer Nummer unter zwei Stellen eine führende Null anhängen will.

Beispieldatei sieht etwa so aus:
DEVICE "XO_D1_luzi"
{
-sync
-retry
}

DEVICE "LOC_D2_zenzi"
{
-sync
-retry
}
und so weiter...
DEVICE "OO_D10_seppi"
{
-sync
-retry
}
und so weiter...


Im Beispiel würde ich also gerne in der Zeile in der das DEVICE genannt wird folgende Änderung haben:

DEVICE "XO_D01_luzi"
[...]
DEVICE "LOC_D02_zenzi"
[...]
DEVICE "OO_D10_seppi"

Habe es mit folgender Syntax versucht

Code:
for file in $(ls -1)
do
sed -e '/DEVICE/s/_D/&0/g' $file >$file.new
done

Das hängt mir die 0 aber vorne auch bei zweistelligen Zahlen an.

DEVICE "XO_D01_luzi"
[...]
DEVICE "LOC_D02_zenzi"
[...]
DEVICE "OO_D010_seppi"

Ich möchte nur Einstellige ergänzen. :?
 
Zuletzt bearbeitet:
Hi,

es gibt sicher eine schönere Lösung, aber vielleicht reicht dir das ja:
Code:
sed -e '/DEVICE/s/\(_D\)\([[:digit:]]_\)/\10\2/g' $file >$file.new
(Und es is spät! :) )
 
sed

Code:
sed: Function /DEVICE/s/\(D_)\([[:digit:]]_\)/\10\2/g cannot be parsed.

Der hier geht ohne Probleme durch, aber überschreibt den hinteren Underscore _

DEVICE "XO_D01luzi"
[...]
DEVICE "LOC_D02zenzi"
[...]
DEVICE "OO_D010_seppi"


Code:
/DEVICE/s/\(_D\)\([[:digit:]]\)\(_\)/\10\2/g'
 
Zuletzt bearbeitet:
@spaceball:

Code:
stephan@unimatrix ~/var/svn :( $ /bin/ls
svn-000  svn-001  svn-002  svn-003  svn-004  svn-005

Code:
/bin/ls | sed -n '${s/^svn-//p}'
Code:
stephan@unimatrix ~/var/svn :) $ /bin/ls | sed -n '${s/^svn-//p}'
005
 
Zuletzt bearbeitet:
Code:
sed: Function /DEVICE/s/\(D_)\([[:digit:]]_\)/\10\2/g cannot be parsed.
Ja, da fehlt auch ein \ hinter dem D_. Hatte ich so aber auch nicht geschrieben :)

Der hier geht ohne Probleme durch, aber überschreibt den hinteren Underscore _

DEVICE "XO_D01luzi"
[...]
DEVICE "LOC_D02zenzi"
[...]
DEVICE "OO_D010_seppi"


Code:
/DEVICE/s/\(_D\)\([[:digit:]]\)\(_\)/\10\2/g'
Ist ja auch klar. \1 und \2 zeigen auf die Matchings aus den ersten beiden Klammern. Wenn dann musst du schon alle drei Referenzen angeben, da du ja 3 Klammern hast. (Oder du machst es wie oben beschrieben ;) )
 
sed

:oldman
Jetzt geht mir im hohen Alter endlich doch noch ein Licht auf!

Danke :):D:)
 
Zurück
Oben