ubuntuusers.de

Elegantes Pattern-Match-Skript auf der Bash

Status: Ungelöst | Ubuntu-Version: Kubuntu 11.04 (Natty Narwhal)
Antworten |

pete83

Anmeldungsdatum:
19. September 2009

Beiträge: 70

Hallo,

ich hätte eine Frage bzgl. Pattern Matching auf der Bash, irgendwie habe ich es nicht geschafft, ein Kommando zu finden, mit dem ich in einem String matchen kann, und nachher auf eine Gruppe die zum Pattern passt zugreifen kann. Anwendungsfall war nur ein kleines Skript, mit dem ich auf Knopfdruck die aktuellen Nachrichten von der ZDF mediathek im VLC spielen wollte, da ich öfters erst nach Mitternacht schau, sollte dabei noch geguckt werden, ob es schon nach 19 Uhr ist, und sonst der Tag um eins verringert. In der Web-Adresse ändert sich immer nur der Datumsindex, welcher die Form yymmdd hat, der Hauptteil ist also diesen String zu erstellen. Mein Skript schaut nun so aus:

#! /bin/bash

mediaPreString="http://wstreaming.zdf.de/zdf/veryhigh/"
mediaPostString="_h19.asx"

date=`date --rfc-3339='seconds'`
hour=`echo $date | sed 's:^[0-9]*-[0-9]*-[0-9]* ::g' | sed 's:\:.*::g'`
mediaIndex=`echo $date | sed 's: .*::g' | sed 's:^20::g' | sed 's:-::g'`

if [ $hour -le 19 ]
then
mediaIndex=$((mediaIndex-1))
fi

mediaAddress=$mediaPreString$mediaIndex$mediaPostString

vlc $mediaAddress

Es läuft auch, aber ich empfinde es als sehr unschön, dass ich immer hintereinander-pipen muss, und immer nur patterns rauslösche, anstatt einfach auf das was ich will zu matchen und es dann wiederzuverwenden. Darum dachte ich, vielleicht kann mir jemand im Forum, der sich besser auskennt (ich hab mit der Bash grad erst angefangen...) ne schönere / cleanere / kürzere Version sagen, damit ich für die Zukunft schlauer bin... Ich hätte zum Beispiel sowas gewollt wie

x=`echo $blah | identifizierePatternUndLiefereMatchZurueck("[0-9]*-[0-9]*-[0-9]*")`

So dass dann, wenn "$blah = 2011-07-11 13:45:00+02:00" zum Beispiel, hinterher in x der Wert 2011-07-11 gespeichert ist... Aber hab nix dazu gefunden... Oder geht das auf der Bash nicht? Aber ich meine, irgendwann mal sowas gelesen zu haben, glaube sogar mit sed, aber kann's einfach nicht mehr finden...

Vielen Dank auf alle Fälle für jeglichen Input ☺

PS: Was auch nicht geklappt hat, war auf eine exakte Anzahl zu matchen, obwohl doch sowas wie [0-9]{4} eine Regex sein müsste, die z.B. genau 4 digits matcht

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Pete,

Du machst es ja auch jämmerlich kompliziert ... Du hast bestimmt man date nicht gelesen, stimmt's ?

Sonst wüsstest Du, dass Du dem date nur das passende Format mitgeben musst, dann ist alles gut.
Außerdem nimmt man besser "$( ... )" und nicht das veraltete "` ... `" :

#! /bin/bash

mediaPreString="http://wstreaming.zdf.de/zdf/veryhigh/"
mediaPostString="_h19.asx"

if [ $( date +%I ) -le 19 ] ; then
        mediaIndex=$( date -d yesterday +%y%m%d )
else
        mediaIndex=$( date +%y%m%d )
fi

vlc "$mediaPreString$mediaIndex$mediaPostString"

Den if ... fi- Block könntest Du auch kurz ersetzen durch

mediaIndex=$( date -d -19hours +%y%m%d )

Deine Subtraktion wird wohl beim Monats-Ersten nicht richtig funktionieren.

LG,

track

dominator

Avatar von dominator

Anmeldungsdatum:
18. März 2008

Beiträge: 90

Wohnort: Meistens im Bierparadies Oberfranken

Vielleicht hilft dir ja auch der Bash-interne Regex Operator =~ 💡

Oder hier findest du allgemeine Hinweise zur Verwendung von Regexps in der Bash : http://tldp.org/LDP/abs/html/x16900.html

pete83

(Themenstarter)

Anmeldungsdatum:
19. September 2009

Beiträge: 70

Vielen Dank für die Hilfe ☺ Ich hatte eigtl. man date schon gelesen, aber komischerweise hab ich instinktiv nach einem flag "-f" für Format oder so gesucht, und als ich so ein Flag nicht gesehen hab, hab ich alles andere ausgeblendet *g* Na so ists ja viel einfacher ☺ Der Link zu den Regexes hat dazu mein PS-Problem gelöst, hatte vergessen, die {} zu escapen... Naja, wie gesagt, ich fang grad erst mit der Bash an, aber das jetzt bringt mich wieder ein Stück weiter ☺

PS: Ich glaube aber, es muss " if [ $( date +%H) -le 19 ] " heißen, und nicht +%I , da man ja Hours im Bereich 0..23 will und nicht 1..12, wenn ich "man date" jetzt richtig verstehe *g* Aber ich werde dann den unteren Vorschlag nehmen, der auf if fi verzichtet ☺ Vielen Dank auf alle Fälle, jetzt kann ich das Skript ja wesentlich eleganter schreiben...

Antworten |