RubenH
Anmeldungsdatum: 4. Oktober 2007
Beiträge: Zähle...
Wohnort: Hannover
|
Hallo,
ich würd gern den Dateinamen von tar-Archiven, wie z.B. iana-etc-2.10.tar.bz2, in Name, Versionsnummer und Dateityp zerlegen.
Ich glaub Regular Expressions sind da wahrscheinlich das beste, oder? Leider hab ich keine Ahnung wie ich das machen soll. Wie man am Beispiel sieht, kann man leider nicht einfach nach "-" und "." tokenizen. Grüsse, Ruben EDIT:
In einem shell-skript.
|
Lux
Anmeldungsdatum: 10. November 2005
Beiträge: 5152
Wohnort: Grüt (Gossau ZH), Schweiz
|
RubenH schrieb: Leider hab ich keine Ahnung wie ich das machen soll. Wie man am Beispiel sieht, kann man leider nicht einfach nach "-" und "." tokenizen.
Wie soll denn das Ergebnis aussehen? Welche Dateiendungen können vorkommen? Gruss Dirk
|
RubenH
(Themenstarter)
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 124
Wohnort: Hannover
|
Als Dateiendung kann .tar.gz und tar.bz2 vorkommen denke ich und, um mal bei o.g. Beispiel zu bleiben, soll das ergebnis etwa so aussehen: name="iana-etc"
ver="2.10"
compression="bz2"
|
MrKanister
Anmeldungsdatum: 13. Oktober 2007
Beiträge: 2105
|
Gut wären noch ein paar mehr Beispiele. Denn gerade bei Versions-Nummern und Names-Gebungs-Schemen können sehr exotische exemplare dabei sein. 😉 Gruß Martin
|
MrKanister
Anmeldungsdatum: 13. Oktober 2007
Beiträge: 2105
|
Hier mal ein Einzeiler, der dein Beipiel richtig verabeitet:
| echo "iana-etc-2.10.tar.bz2" | sed -e 's/^\(.*\)-\([0-9]*.*\)\(\.[^\.]*\.[^\.]*\)$/\1\n\2\n\3/g'
iana-etc
2.10
.tar.bz2
|
Aber wie gesagt, bei exotischeren Sachen kann das auch wieder nicht hinhauen. Gruß Martin
|
RubenH
(Themenstarter)
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 124
Wohnort: Hannover
|
Also bis jetzt hats gut funktioniert. Vielen Dank
Jetzt versuch ich das ma zu kapieren;-)
|
RubenH
(Themenstarter)
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 124
Wohnort: Hannover
|
Äh,kannst du mir das vielleicht grob auseinandersetzen. Ich kapier das nicht. Und wie krieg ich das jetzt elegant in 3 variablen rein?
|
MrKanister
Anmeldungsdatum: 13. Oktober 2007
Beiträge: 2105
|
Also...(ich hoffe du weiß grob wie reguläre Ausdrücke funktionieren)...
\(.*\)
Da solltest du noch durchblicken...ein beliebiges Zeichen (.) beliebig oft (*). Darum zwei Klammern damit man das ganze im Erstzungsstring über \1 wieder benutzen kann. -\([0-9]*.*\)
Danach ein "-", gefolgt von beliebig vielen Ziffern ([0-9]*) und danach beliebige Zeichen (.*), also der Rest der eigentlichen Version. Den "-" habe ich nicht mit unklammert, da ich den in Versions-Nummer nicht haben will. \(\.[^\.]*\.[^\.]*\)
Jetzt noch die Endung. Da du gesagt hast, dass die Endungen ".tar.gz" und "tar.bz2" vorkommen könne, hab ich das mal grob als 2x ein Punkt (\.) jeweils gefolgt von beliebig vielen Nicht-Punkten ([^\.]*) vormuliert (und natürlich wieder Klammern drum). Durch "\1\n\2\n\3" kann ich nun wieder auf die Inhalte der Klammern zugreifen. Um auf einzelne Bestandteile zuzugreifen und diese in Vriablen zu schreiben, kannst du ja statt allen Inhalten zB. einfach nur den Inhalt der ersten Klammer ausgeben lassen: | name=$(echo "iana-etc-2.10.tar.bz2" | sed -e 's/^\(.*\)-\([0-9]*.*\)\(\.[^\.]*\.[^\.]*\)$/\1/g')
|
Hoffe, ich konnte mich halbwegs verständlich ausdrücken... PS: deb-Paket-Namen parsen ist einfacher 😉
|
RubenH
(Themenstarter)
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 124
Wohnort: Hannover
|
Ja, also wirklich vielen, vielen Dank nochmal.
|
phst
Anmeldungsdatum: 24. Juni 2007
Beiträge: 527
|
Dafür braucht man keine externen Programme wie sed , das kann Bash auch:
| TEST=iana-etc-2.10.tar.bz2
REGEX='^(.+)-([0-9.]+[0-9])\.(.+)'
if [[ $TEXT =~ $REGEX ]]
then
NAME=${BASH_REMATCH[1]}
VERSION=${BASH_REMATCH[2]}
EXTENSION=${BASH_REMATCH[3]}
fi
echo "Name: $NAME, Version: $VERSION, Extension: $EXTENSION"
|
|
dominator
Anmeldungsdatum: 18. März 2008
Beiträge: 90
Wohnort: Meistens im Bierparadies Oberfranken
|
phst schrieb: Dafür braucht man keine externen Programme wie sed , das kann Bash auch:
| TEST=iana-etc-2.10.tar.bz2
REGEX='^(.+)-([0-9.]+[0-9])\.(.+)'
if [[ $TEXT =~ $REGEX ]]
then
NAME=${BASH_REMATCH[1]}
VERSION=${BASH_REMATCH[2]}
EXTENSION=${BASH_REMATCH[3]}
fi
echo "Name: $NAME, Version: $VERSION, Extension: $EXTENSION"
|
Ist auch hier http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF so beschrieben, funktioniert aber bei mir leider nicht 😢 Bash 3.2.25(1), Ubuntu 7.10
|
phst
Anmeldungsdatum: 24. Juni 2007
Beiträge: 527
|
dominator schrieb: Ist auch hier http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF so beschrieben, funktioniert aber bei mir leider nicht 😢 Bash 3.2.25(1), Ubuntu 7.10
Ich vermute, dass dein Skript mit #!/bin/sh und nicht mit #!/bin/bash anfängt, dann wird natürlich die Bash auch nicht benutzt.
|
dominator
Anmeldungsdatum: 18. März 2008
Beiträge: 90
Wohnort: Meistens im Bierparadies Oberfranken
|
phst schrieb: Ich vermute, dass dein Skript mit #!/bin/sh und nicht mit #!/bin/bash anfängt, dann wird natürlich die Bash auch nicht benutzt.
Hm, ne nur copy&paste und dann ein #!/bin/bash davor:
1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
#####
# Regex innerhalb der Bash
TEST=iana-etc-2.10.tar.bz2
REGEX='^(.+)-([0-9.]+[0-9])\.(.+)'
if [[ $TEXT =~ $REGEX ]]
then
NAME=${BASH_REMATCH[1]}
VERSION=${BASH_REMATCH[2]}
EXTENSION=${BASH_REMATCH[3]}
fi
echo "Name: $NAME, Version: $VERSION, Extension: $EXTENSION"
|
Da kommt bei mir "Name: , Version: , Extension:" raus ❓
|
sdx23
Anmeldungsdatum: 19. August 2008
Beiträge: 154
|
dominator schrieb: phst schrieb: Ich vermute, dass dein Skript mit #!/bin/sh und nicht mit #!/bin/bash anfängt, dann wird natürlich die Bash auch nicht benutzt.
Ich setz euch mal ne Brille auf. 😉 TEST oder TEXT, bitte entscheiden Sie sich jetzt... Und ein Paar ' ' könnten bei Strings nicht Schaden. 1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
#####
# Regex innerhalb der Bash
TEST='iana-etc-2.10.tar.bz2'
REGEX='^(.+)-([0-9.]+[0-9])\.(.+)'
if [[ $TEST =~ $REGEX ]]
then
NAME=${BASH_REMATCH[1]}
VERSION=${BASH_REMATCH[2]}
EXTENSION=${BASH_REMATCH[3]}
fi
echo "Name: $NAME, Version: $VERSION, Extension: $EXTENSION"
|
Gruß
|
phst
Anmeldungsdatum: 24. Juni 2007
Beiträge: 527
|
Sorry, mein Fehler. Die Variable heißt ein Mal TEST , beim zweiten Mal TEXT . Bei der zweiten Benutzung sollte sie natürlich auch TEST lauten.
|