$ cat tst.awk
BEGIN {
ORS="\r\n"
print "BEGIN:VCALENDAR"
print "... some entries here ..."
print "END:VTIMEZONE"
}
/^[^[:space:]]/ {
prtEndVevent()
print "BEGIN:VEVENT"
print "... some entries here ..."
date = $4 $3 $2
begt = $5 $6 "00"
endt = $7 $8 "00"
print "DTSTART;TZID=Europe/Zurich:" date "T" begt
print "DTEND;TZID=Europe/Zurich:" date "T" endt
next
}
{
gsub(/^[[:space:]]+|[[:space:]]+$/,"")
desc = (desc == "" ? "DESCRIPTION:" : desc RS) $0
}
END {
prtEndVevent()
print "END:VCALENDAR"
}
function prtEndVevent( wid) {
if ( desc != "" ) {
wid = 74
gsub(RS,"\\n",desc)
while ( desc !~ /^ ?$/ ) {
print substr(desc,1,wid)
desc = " " substr(desc,wid+1)
}
desc = ""
}
if ( endVevent != "" ) {
print endVevent
}
endVevent = "END:VEVENT"
}
.
$ awk -f tst.awk file
BEGIN:VCALENDAR
... some entries here ...
END:VTIMEZONE
BEGIN:VEVENT
... some entries here ...
DTSTART;TZID=Europe/Zurich:20190506T081500
DTEND;TZID=Europe/Zurich:20190506T090000
DESCRIPTION:A descritpion text.
END:VEVENT
BEGIN:VEVENT
... some entries here ...
DTSTART;TZID=Europe/Zurich:20190510T110000
DTEND;TZID=Europe/Zurich:20190510T114500
DESCRIPTION:Another description text\n- on multiple;\n- lines.
END:VEVENT
BEGIN:VEVENT
... some entries here ...
DTSTART;TZID=Europe/Zurich:20190513T081500
DTEND;TZID=Europe/Zurich:20190513T090000
END:VEVENT
BEGIN:VEVENT
... some entries here ...
DTSTART;TZID=Europe/Zurich:20190517T110000
DTEND;TZID=Europe/Zurich:20190517T114500
DESCRIPTION:A long description with more than 75 characters.\nThis happen
often when multiple lines are\njoined in one. So the program shoud split
every lines\nTo 75 characters including the word description.
END:VEVENT
BEGIN:VEVENT
... some entries here ...
DTSTART;TZID=Europe/Zurich:20190520T081500
DTEND;TZID=Europe/Zurich:20190520T090000
DESCRIPTION:A description text.
END:VEVENT
END:VCALENDAR
Обратите внимание, что это перенос по позициям символов, а не по границам слов, поэтому, если слово пересекает 75-ю позицию символа, оно будет разделено. Если это нежелательно, вы можете обновить prtDesc()
для печати по одному слову за раз, проверив, будет ли общая длина всех напечатанных слов + пробелов плюс следующее слово меньше 75 (и решить, как обрабатывать строку описания, которая равна 75 + chars long без пробелов!) или вызовите команду UNIX fold
, чтобы сделать перенос для вас.
Если вы когда-нибудь задумывались об использовании getline
, обязательно сначала прочитайте и полностью поймите http://awk.freeshell.org/AllAboutGetline.