PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash: String zerlegen - mal wieder...



meinereinerseiner
30-07-2009, 11:45
Hallo,

ich habe da einen string: d:\\bla\\\blubb\\\\blubber\prog.exe
und hätte gern sowas draus gemacht: d bla/blubb/blubber prog.exe

Ein Problem ist, das die Anzahl der "\" durchaus unterschiedlich ist - nicht nach den Sinn fragen, da hab ich keinen Einfluss drauf, ich muss es nur verarbeiten. :(


echo "d:\\bla\\\blubb\\\\blubber\prog.exe" | sed -e s/:/\ /g | tr \\ /
das liefert schonmal:
d /bla//blubb//blubber/prog.exe


aber wie weiter?

und kann ich mir das Ergebnis dann in einem Rutsch in 3 Variablen packen, oder geht das nur via:


ERGEBNIS=`echo "string" | sed .....`
V1=`echo $ERGEBNIS | awk '{print $1}'`
V2=`echo $ERGEBNIS | awk '{print $2}'`
V3=`echo $ERGEBNIS | awk '{print $3}'`


thx,
tom

DieterH
03-08-2009, 15:13
> d:\\bla\\\blubb\\\\blubber\prog.exe

Ich schlage vor, das Windoze-Getöns erst mal auf Linux-Notation zu bringen:

1. Damit der Rückschrägstrich seine LITERALE Bedeutung beibehält, erst mal die Zeichenkette in eine Datei /tmp/abc1 ablegen (mit Cut & Paste, NICHT mit echo!)

2. Ersetzen der Rückschrägstriche in normale Schrägstriche:
cat /tmp/abc1 |sed -e 's/\\\{1,\}/\//g' > /tmp/abc2

3. Herausziehen der Laufwerksbezeichnung:
Voraussetzung: Laufwerksbezeichnung steht in Spalte 1!
LAUFWERK=`cat /tmp/abc2 | awk -F" " '{printf("%s",substr($0,1,1));}'`

4. Herausziehen des Dateinamens (ohne Lw-Bezeichnung):
Voraussetzung: Dateiname beginnt ab Position 3!
FILENAME=`cat /tmp/abc2 | awk -F" " '{printf("%s",substr($0,3))}';

5. Abspalten von Verzeichnis- und Basisnamen:
VERZ_NAME=`dirname ${FILENAME}`
BASIS_NAME=`basename ${FILENAME}`

Falls Du eine Reihe von in Zeilen angeordneten Windoze-Dateinamen abarbeiten musst, dann packst Du die einzelnen ANweisungen in eine for-Schleife:

for in in `cat /tmp/DATEI-MIT-WINDOZE-DATEINAMEN` ; do
echo $i > /tmp/abc1
.... (die obigen Anweisungen)
done

Gruss
Dieter