在linux上将vcf生日转换为caldav

在linux上将vcf生日转换为caldav,linux,python-3.x,awk,vcf-vcard,caldav,Linux,Python 3.x,Awk,Vcf Vcard,Caldav,我有一个vCard文件mycontacts.vcf: BEGIN:VCARD N:Montana;Joe;;; FN:Joe Montana BDAY;value=date:1988-05-20 END:VCARD BEGIN:VCARD N:Smith;Joe;;; FN:Joe Smith BDAY;value=date:1999-07-04 END:VCARD 如何从linux命令行(例如,使用awk或简单的python脚本)从中创建CalDAV文件,以便输出为: BEGIN:VEVE

我有一个vCard文件
mycontacts.vcf

BEGIN:VCARD
N:Montana;Joe;;;
FN:Joe Montana
BDAY;value=date:1988-05-20
END:VCARD

BEGIN:VCARD
N:Smith;Joe;;;
FN:Joe Smith
BDAY;value=date:1999-07-04
END:VCARD
如何从linux命令行(例如,使用awk或简单的python脚本)从中创建CalDAV文件,以便输出为:

BEGIN:VEVENT
SUMMARY:Joe Montana
DTSTART;VALUE=DATE:19880520
DTEND;VALUE=DATE:19880521
END:VEVENT

BEGIN:VEVENT
SUMMARY:Joe Smith
DTSTART;VALUE=DATE:19990704
DTEND;VALUE=DATE:19990705
END:VEVENT
顺便说一下,联系人是使用pythonista应用程序从ipad导出的:

import contacts
people = contacts.get_all_people()
for p in people:
  print(p.vcard.decode('utf-8'))

生成的CalDAV将导入到thunderbird中。

对于任何awk,您都可以将结束日期设置为当前日期:

$ cat vcf2dav.awk
BEGIN { OFS=":" }
!NF { print; next }
{
    tag = val = $0
    sub(/[:;].*$/,"",tag)
    sub(/^[^:]+:/,"",val)
}
tag ~ /^(BEGIN|END)$/ { print tag, "VEVENT" }
tag == "FN" { print "SUMMARY", val }
tag == "BDAY" {
    gsub(/-/,"",val)
    print "DTSTART;VALUE=DATE", val
    print "DTEND;VALUE=DATE", val
}

但是,如果您真的希望它是后天的,那么您需要使用时间函数,例如,使用GNU awk来实现内置时间函数:

$ cat vcf2dav.awk
BEGIN { OFS=":" }
!NF { print; next }
{
    tag = val = $0
    sub(/[:;].*$/,"",tag)
    sub(/^[^:]+:/,"",val)
}
tag ~ /^(BEGIN|END)$/ { print tag, "VEVENT" }
tag == "FN" { print "SUMMARY", val }
tag == "BDAY" {
    begDate = val
    endDate = dayAfter(begDate)
    gsub(/-/,"",begDate)
    print "DTSTART;VALUE=DATE", begDate
    print "DTEND;VALUE=DATE",   endDate
}

function dayAfter(curDate,      curSecs, nxtDate) {
    curSecs = mktime(gensub(/-/," ","g",curDate)" 0 0 0")
    nxtDate = strftime("%Y%m%d",curSecs + 24*60*60)
    return nxtDate
}

对于其他AWK,您可以将
dayAfter()
函数更改为调用UNIX
date
或执行环境中的任何其他操作以获得第二天

$ cat vcf2dav.awk
BEGIN { OFS=":" }
!NF { print; next }
{
    tag = val = $0
    sub(/[:;].*$/,"",tag)
    sub(/^[^:]+:/,"",val)
}
tag ~ /^(BEGIN|END)$/ { print tag, "VEVENT" }
tag == "FN" { print "SUMMARY", val }
tag == "BDAY" {
    begDate = val
    endDate = dayAfter(begDate)
    gsub(/-/,"",begDate)
    print "DTSTART;VALUE=DATE", begDate
    print "DTEND;VALUE=DATE",   endDate
}

function dayAfter(curDate,      curSecs, nxtDate) {
    curSecs = mktime(gensub(/-/," ","g",curDate)" 0 0 0")
    nxtDate = strftime("%Y%m%d",curSecs + 24*60*60)
    return nxtDate
}
$ awk -f vcf2dav.awk mycontacts.vcf
BEGIN:VEVENT
SUMMARY:Joe Montana
DTSTART;VALUE=DATE:19880520
DTEND;VALUE=DATE:19880521
END:VEVENT

BEGIN:VEVENT
SUMMARY:Joe Smith
DTSTART;VALUE=DATE:19990704
DTEND;VALUE=DATE:19990705
END:VEVENT