【问题标题】:convert vcf birthdays to caldav on linux [closed]在Linux上将vcf生日转换为caldav [关闭]
【发布时间】:2019-08-08 15:03:13
【问题描述】:

我有一个 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 命令行创建 CalDAV 文件,例如使用 awk 或简单的 python 脚本,输出如下:

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。

【问题讨论】:

    标签: linux python-3.x awk vcf-vcard caldav


    【解决方案1】:

    您可以使用任何 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
    }
    

    .

    $ awk -f vcf2dav.awk mycontacts.vcf
    BEGIN:VEVENT
    SUMMARY:Joe Montana
    DTSTART;VALUE=DATE:19880520
    DTEND;VALUE=DATE:19880520
    END:VEVENT
    
    BEGIN:VEVENT
    SUMMARY:Joe Smith
    DTSTART;VALUE=DATE:19990704
    DTEND;VALUE=DATE:19990704
    END:VEVENT
    

    但如果你真的希望它是后天,那么你需要使用时间函数,例如使用 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 -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
    

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

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2013-11-13
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      相关资源
      最近更新 更多