ubuntuusers.de

String in Date konvertieren

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

deadland

Avatar von deadland

Anmeldungsdatum:
7. Dezember 2005

Beiträge: 245

Hallo Leute,

ich möchte einen kleinen (meinen ersten) Skript schreiben, der mir einen Timer für einen Aufnahme so aufbereitet, so dass ich ihn in /proc/acpi/alarm schieben kann.

Ein Beispiel:

cat /etc/vdr/timers.conf 
1:C-0-217-3476:2008-02-08:1805:1850:50:99:Die Simpsons:
1:C-0-217-3476:2008-02-08:1555:1710:50:99:Deine Chance! 3 Bewerber - 1 Job:

und der Skript soll die frühste Aufnahme wählen und dann in diesem Format in /proc/acpi/alarm speichern:

echo 2008-02-06 18:00:00 >/proc/acpi/alarm

Brainstorming für den Skript:

if (timer<= heute OR timer=0)

then

poweroff

else

echo 'timer' > /proc/acpi/alarm

"und dann den vdr in S3 versetzen"

END

Tut mir leid, ich bin noch totaler Anfänger, aber danach habe ich bestimmt einiges dazugelernt.

Danke für jeden Tipp

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

deadland hat geschrieben:

Ein Beispiel:

cat /etc/vdr/timers.conf 
1:C-0-217-3476:2008-02-08:1805:1850:50:99:Die Simpsons:
1:C-0-217-3476:2008-02-08:1555:1710:50:99:Deine Chance! 3 Bewerber - 1 Job:

und der Skript soll die frühste Aufnahme wählen und dann in diesem Format in /proc/acpi/alarm speichern:

echo 2008-02-06 18:00:00 >/proc/acpi/alarm

Die früheste Aufnahme wäre doch
2008-02-06 15:55!

echo "1:C-0-217-3476:2008-02-08:1805:1850:50:99:Die Simpsons:
1:C-0-217-3476:2008-02-08:1555:1710:50:99:Deine Chance! 3 Bewerber - 1 Job:" | sed 's/[^:]*:[^:]*:\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\):\([0-9]\{2\}\)\([0-9]\{2\}\).*/\1 \2:\3:00/g'

2008-02-08 18:05:00
2008-02-08 15:55:00


[0-9] ist die Zeichenklasse der Zeichen von 0 bis 9.
[0-9]{4} bedeutet exact 4 Stück dieser Zeichen, aber die geschweiften Klammern müssen maskiert werden.
([0-9]\{4\}) Runde Klammern fassen einen Ausdruck zusammen, so daß man später mit \1 auf den ersten Wert, der diesem Muster entspricht zugreifen kann.
\([0-9]\{4\}\) weil die runden Klammern auch maskiert werden müssen. ☺
Solche Maskierungsorgien kann man dann in Bus setzen, und zum Karneval in Venedig oder Rio verschicken.
[^:] bezeichnet alle Zeichen außer : [^:asdf] würde alle Zeichen außer :asdf bezeichnen - das Caret als erstes Zeichen in den eckigen Klammern bewirkt dies, und auch für ein einzelnes Zeichen muß man die []-Klassensyntax einsetzen - ein Caret bezeichnet ansonsten den Beginn der Zeile.

deadland

(Themenstarter)
Avatar von deadland

Anmeldungsdatum:
7. Dezember 2005

Beiträge: 245

Wahnsinn, das hätte ich alleine nie hinbekommen.

Vielen Dank!

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

@user unknown:

Nur damit ich es auch komplett verstehe, ein paar Rückfragen...

's/[^:]*:[^:]*:\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\):\([0-9]\{2\}\)\([0-9]\{2\}\).*/\1 \2:\3:00/g'

1. Was bedeutet das s/ zu Beginn?

2. Ich vermute dieses [^:]*: bedeutet, dass er alles (weil *) bis zum nächsten Doppelpunkt löschen soll - den Doppelpunkt dabei aber inklusive. Vielleicht kannst du das noch im Detail erklären...Das ganze zweimal, damit man bis 2008 kommt.

3. Als nächstes sagt man: "Es gibt vier Stellen, die jeweils eine Zahl von 0-9 enthalten", dann kommt ein Bindestrich, den er löschen soll und danach zweimal das selbe Spiel mit jeweils zwei Stellen. Dann der Doppepunkt und zwei Stellen dahinter und danach komm ich leider nicht mehr mit... ☹

4. Was bedeutet das .*/\1 \2:\3:00/g am Ende?

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Und da muss man sich als Perl Programmier immer anhören das Perl so unleserlich ist. 😉
Immerhin habe ich in Perl bei Regexen das /x Flag und kann eine Regex auf mehrere Zeilen aufteilen und Kommentare hinzufügen...

Aber ich würde es sowieso nicht über Regexe machen. In dem Fall viel zu komplex. 😉

echo "1:C-0-217-3476:2008-02-08:1805:1850:50:99:Die Simpsons:" | perl -F: -wlane 'substr $F[3], 2, 0, ":"; print "$F[2] $F[3]"'

Optional kannst du auch gleich eine Datei eingeben:

perl -F: -wlane 'substr $F[3], 2, 0, ":"; print "$F[2] $F[3]"' /etc/vdr/timers.conf 

1) Zeile an ":" Trennen.
2) Beim Feld für die Zeit nach der zweiten Position ein ":" einfügen.
3) Datumstempel und Zeitstempel ausgeben.

Allerdiengs sehe ich im Code von user unknown nicht wo er nach der Zeit Sortiert... (Ich mache es in diesem Beispiel aber auch nicht)

Eine Möglichkeit noch gleich nur die neuste Zeile auszugeben.

sidburn@sid ~ $ cat file
1:C-0-217-3476:2008-02-08:1805:1850:50:99:Die Simpsons:
1:C-0-217-3476:2008-02-08:1555:1710:50:99:Deine Chance! 3 Bewerber - 1 Job:
sidburn@sid ~ $ perl -F: -wlane 'substr $F[3], 2, 0, ":"; print "$F[2] $F[3]"' file | sort | head -n1
2008-02-08 15:55

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

killek hat geschrieben:

@user unknown:

Nur damit ich es auch komplett verstehe, ein paar Rückfragen...

's/[^:]*:[^:]*:\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\):\([0-9]\{2\}\)\([0-9]\{2\}\).*/\1 \2:\3:00/g'

1. Was bedeutet das s/ zu Beginn?

s=substitute, ersetzen
s/vorher/nachher/g
g=global - also wenn er das Muster mehrfach in einer Zeile findet, soll er mehrfach ersetzen - nicht nur den ersten Fund.
killek hat geschrieben:

2. Ich vermute dieses [^:]*: bedeutet, dass er alles (weil *) bis zum nächsten Doppelpunkt löschen soll - den Doppelpunkt dabei aber inklusive. Vielleicht kannst du das noch im Detail erklären...Das ganze zweimal, damit man bis 2008 kommt.

Nich ganz, im Endeffekt aber doch.
* steht nicht wie bei file-globbing für etwas beliebiges, sonder für beliebig viele Vorkommnisse des davor befindlichen Dingens.
.* sind beliebig viele beliebige Zeichen, weil der Punkt für ein beliebiges Zeichen steht
[0-3]* passt auf 0, 00, 000, 013, 3030121 usw - auf beliebig lange Kombination aus Zeichen der Menge [0-3]
[^:]* steht für beliebig viele Nicht-Doppelpunkte (dann aber gefolgt von einem Doppelpunkt usw.)
killek hat geschrieben:

3. Als nächstes sagt man: "Es gibt vier Stellen, die jeweils eine Zahl von 0-9 enthalten", dann kommt ein Bindestrich, den er löschen soll und danach zweimal das selbe Spiel mit jeweils zwei Stellen. Dann der Doppepunkt und zwei Stellen dahinter und danach komm ich leider nicht mehr mit... ☹

4. Was bedeutet das .*/\1 \2:\3:00/g am Ende?

.* sind beliebig viele beliebige Zeichen,also alles bis zumj Zeilenende. Das steht also im Widerspruch zum abschließenden /g, da die Ausdrücke gefräßig sind, und versuchen so groß zu werden wie möglich, und dann bleibt nichts übrig für einen zweiten Treffer.
Wenn Der Quellcode nicht 2 Farben in einer Zeile hat kannst Du es aber so lassen.

Ein Beispiell - simplifiziert, indem die maskierenden Backslashes vor den Klammern weggelassen wurden:

echo "foobarbas" | sed -s s/(foo)(bar)(bas)/\3\2\1/


erzeugt basbarfoo - den 3., den 2. und dann den ersten Treffer. Treffer ist nur das, was in runden Klammern definiert wurde.
Das Beispiel krankt natürlich daran, daß bas bar und foo feste Zeichenketten sind, - man könnte hier ebensogut s/foobarbas/basbarfoo/ schreiben.

Im Beispiel wird vorne der Müll einfach nicht mit runden Klammern erfaßt.
Das erste Paar erfaßt das Datum: \([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)
das zweite die 2 Ziffern der Stunden \([0-9]\{2\}\)
und das dritte die 2 Ziffern der Minuten.

/\1 \2:\3:00
(date) (hh):(mm):00
Antworten |