ubuntuusers.de

mit REs substring extrahieren

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

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 Team-Icon

Avatar von 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:

1
2
3
4
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:

1
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:

1
2
3
4
5
6
7
8
9
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

Avatar von 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:

1
2
3
4
5
6
7
8
9
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

Avatar von 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.

Antworten |