linux - 在 Linux 上将 vcf 生日转换为 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 命令行创建一个 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。

最佳答案

使用任何 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 或执行您环境中的任何其他工作以获得第二天。

关于linux - 在 Linux 上将 vcf 生日转换为 caldav,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57415621/

相关文章:

linux - 从 headless 程序获取蓝牙事件

python - python 2.7中的HTTPS请求

c# - 如何连接到 C# 中的本地套接字?

python - 如何为图例的个体值设置独特的颜色

python - 如何让 on_press 在自定义按钮中工作?

linux - Apache - 最后一小时的日志

Linux 重定向;可以在重定向之间切换吗?

python - 守护进程与 python 3

linux - 提取两个文件之间的差异值

awk - 使用 awk 或其他 bash 脚本在多列中搜索低于阈值的值