PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash-Programmierung - String splitten...



Schlaubi_fi.de
11.04.2005, 16:40
Hallo,

ich habe folgendes Problem. Ich habe eine fortlaufende Nr. z.B. 01234567.
Am Ende dieser Nr. bzw. des Strings befindet sich sporadisch eine Extension,
also z.B. 01234567.ext

Ich möchte nun mit bash/perl/awk/?? den String splitten und zwar, dass .* abgeschnippelt wird; die letzten 2 Ziffern bleiben unberührt und werden ignoriert und ab dann, also (von rechts inkl. ext und . - ab dem 7ten Zeichen) wird der String jeweils zu 2 Ziffern zusammengefasst:

string=0123456789.ext

ext=.ext
x=89.ext

01-23-45-67


Ich habe mich in bash bereits versucht, aber das haut einfach nicht hin:
${parameter:offset:length}

MrFenix
11.04.2005, 17:48
#!/bin/bash
str="0123456789.ext" #sollte klar sein
ext="${str//[0-9]/}" #ext = schneide alle Zahlen aus dem String
echo $ext # ext ausgeben
len=`expr length $str` #len = länge vom original
len2=`expr length $ext` #len2 = länge von der extension
len3=`expr $len - $len2 - 2` #len3 = länge von allem außer der extension und den 2 Zahlen am ende
len2=`expr $len2 + 2` #len2 = länge der extension + die 2 Zahlen am ende
x=${str:len3:len2} #x = original von vorletzter zahl bis ende
echo $x # x ausgeben
for ((a=len3-2; a>=0; a=a-2)) #von position der viertletzten zahl bis 0; immer 2 weniger
do
str2="${str:a:2}-$str2" #str2 = original von zählervariable a bis a+2 und -$str2
done
str2=${str2/%"-"/} # - am ende wegschneiden
echo $str2 #str2 ausgeben


Infos genommen von http://www.tldp.org/LDP/abs/html/string-manipulation.html

EDIT: Noch ne for-schleife reingebaut, damit es auch mit mehr zahlen klappt.

Schlaubi_fi.de
12.04.2005, 08:54
Hey,

vielen Dank - einfach klasse...für diesen Code hätte ich sogar etwas bezahlt :D

Schlaubi_fi.de
12.04.2005, 13:51
Hallo,

wenn mir jetzt noch jemand sagen könnte, wie ich folgendes Problem bewerkstellige bin ich glaube ich zufrieden... :devil:

Wenn ein String ungerade ist, von der Zeichenanzahl,
dann muss ihm eine Null vorangestellt werden, die Länge des Strings ist variabel. Leider kann die Bash nur Ganzzahlen teilen und bringt auch keine Fehlermeldung wenn die Teilung nicht ganz aufgeht, deshalb schlägt das Folgende fehl...

str=123
l=${#123} # Länge des Strings = 3
test "$str" == "$(($l / 2))" && { # 3 == 1
echo "str="0"$str";
} || {
echo "str=$str";
}

MrFenix
12.04.2005, 17:34
#!/bin/bash
str="123" #String halt
len=`expr length $str` #Länge vom String
if [ `expr $len % 2` != 0 ]; then #wenn der Rest von Länge geteilt durch 2 ungleich 0
str="0$str" #dann string = 0 und string
fi
echo $str #string ausgeben

Schlaubi_fi.de
23.04.2005, 19:44
Vielen Dank, hat einwandfrei funktioniert :))