linux - 在Linux上将vcf生日转换为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()
函数以调用 UNIXdate
或在您的环境中执行任何其他工作以在第二天获得。
推荐阅读
- android - HERE Map SDK 配置具有不同 applicationId 的多个构建变体
- python - 一个烧瓶/反应表出现 500 错误,而另一个却没有?
- hl7-fhir - FHIR 格式的 COVID-19 诊断测试
- java - 无法生成范围报告
- xpath - Jasper Report 如何获取具有另一个兄弟参数的兄弟节点?
- google-cloud-platform - 在 GCP Notebook Instance for Python 模块中设置 JupyterLab 的根文件夹 从不同目录导入我自己的源文件
- safari - 对令人沮丧的野生动物园问题有什么建议吗?
- ssl - Cloudflare - 如何从一开始就隐藏网站的服务器 IP 地址?
- python - 为什么wordcloud库不能使用停用词来阻止python中的汉字
- sql - 如何找到 SQL 中使用最多的实体?