verfeinertes Ersetzen

21/02/2014 - 19:22 von Alexander Goetzenstein | Report spam
Hallo,
mich àrgert immer wieder der .ics-Export des Notes-Kalenders, der aus
ganztàgigen Terminen solche von 04:00-20:00 Uhr macht. Dem möchte ich
nun mit einem Script beikommen, das Zeilen wie diese


DTSTART;TZID="Europe/Berlin":20140222T040000
DTEND;TZID="Europe/Berlin":20140222T200000



sucht und in solche


DTSTART;VALUEÚTE:20140222
DTEND;VALUEÚTE:20140223



wandelt. Die Gemeinsamkeiten beschrànken sich auf den Anfangswert der
Zeile und den Datumswert, der erhalten bleiben soll. Natürlich sollen
Zeilenpaare, bei denen eine der beiden Zeiten von "T040000" bzw.
"T200000" abweicht, nicht veràndert werden.

Die Dateien sind ein paar hundert kB groß, also nicht gerade riesig. Für
die Ersetzung in den Dateien selbst würde ich zuerst auf sed kommen,
aber wie füttere ich das? Oder wàre es besser, das Ganze direkt vom
Script selbst erledigen zu lassen?




Gruß
Alex
 

Lesen sie die antworten

#1 Juergen P. Meier
22/02/2014 - 08:13 | Warnen spam
Alexander Goetzenstein :
mich àrgert immer wieder der .ics-Export des Notes-Kalenders, der aus
ganztàgigen Terminen solche von 04:00-20:00 Uhr macht. Dem möchte ich
nun mit einem Script beikommen, das Zeilen wie diese

DTSTART;TZID="Europe/Berlin":20140222T040000
DTEND;TZID="Europe/Berlin":20140222T200000



sucht und in solche

DTSTART;VALUEÚTE:20140222
DTEND;VALUEÚTE:20140223



wandelt. Die Gemeinsamkeiten beschrànken sich auf den Anfangswert der
Zeile und den Datumswert, der erhalten bleiben soll. Natürlich sollen
Zeilenpaare, bei denen eine der beiden Zeiten von "T040000" bzw.
"T200000" abweicht, nicht veràndert werden.

Die Dateien sind ein paar hundert kB groß, also nicht gerade riesig. Für
die Ersetzung in den Dateien selbst würde ich zuerst auf sed kommen,
aber wie füttere ich das? Oder wàre es besser, das Ganze direkt vom
Script selbst erledigen zu lassen?



Du kannst das erste folgendem sed Konstrukt machen:

's,DTSTART;TZID="[a-zA-Z/]*":\([0-9]*\)T040000,DTSTART;VALUEÚTE:\1,'

Leider ist das DTEND nicht inklusive, d.h. du musst Datumsarithmetik
machen (um den korrekten Folgetag zu berechnen). Das erklaert
vermutlich warum die Kiffer von Lotus Notes sich das gespart haben...

Benoetigt ein GNU date - ein Posix-konformes date reicht leider nicht,
bzw ein date bei dem man das Datum mit "-d" angeben kann.

-
#!/bin/sh

LC_TIME=C
LANG=C
export LC_TIME LANG

# komplette ical Datei zeile fuer zeile durchgehen:
while read line;

#DTEND suchen:
if [ "${line%%;*}" = "DTEND" ]; then

#Erst mal das Datum extrahieren:
dtend=`echo $line | sed 's,DTEND;TZID="[a-zA-Z/]*":\([0-9]*\)T200000,\1,'

#dtend in eine Zeitrepraesentation bringen:
dtsecs=`date +%s -d $dtend`

#Datum des naechsten Tages berechnen (Schaltzeitresistent):
dtend=`date +%Y%M%D -d @$((dtsecs + 90001))`

#DTEND ausgeben
echo "DTEND;VALUEÚTE:$dtend"
else
echo "$line"
fi
exit

Dann die .ical datei durch obigen sed filter und dann durch dieses
script jagen.

Hint: Fals dein GNU date nicht neu genug ist (core-utils <5.3), musst
du bei der Berechung statdessen schreiben:
date +%Y%M%D -d "$dtend + 90001 sec"

Und wenn du kein GNU date hast, musst du perl nehmen.

Juergen
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Ähnliche fragen