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