我有一个 bash 脚本,可以从指定的 ICS (iCalendar) URL 获取日历事件数据并显示当前日期的事件。事件的开始和结束以 ics 格式显示。我不知道如何将 ics 格式转换为 YYYY:MM:DD:HH:mm 格式。
这是我的脚本:
# Define the ICS URL of your calendar
ics_url="your_url"
# Get today's date in YYYYMMDD format
today=$(date +%Y%m%d)
# Use curl to fetch the ICS data and process it
curl -s "$ics_url" | awk -v date="$today" '
BEGIN {
inEvent = 0;
matched = 0;
eventBuffer = "";
}
/BEGIN:VEVENT/ {
inEvent = 1;
matched = 0;
eventBuffer = ""; # Reset event buffer at the beginning of a new event
}
/END:VEVENT/ {
if (matched) {
print eventBuffer; # Print the event buffer if matched
print ""; # Print an empty line after each event
}
inEvent = 0;
}
/^DTSTART:/ {
if (index($0, date) > 0) {
matched = 1;
}
# Replace "DTSTART" with "start"
sub(/^DTSTART:/, "start:", $0);
eventBuffer = eventBuffer "\n" $0;
}
/^DTEND:/ {
# Replace "DTEND" with "end"
sub(/^DTEND:/, "end:", $0);
eventBuffer = eventBuffer "\n" $0;
}
/^SUMMARY|DESCRIPTION/ {
eventBuffer = eventBuffer "\n" $0;
}
'
输出示例:
start:20240502T080000Z
end:20240502T090000Z
SUMMARY:Event
所需输出:
start:2024:05:02:08:00:00
end:2024:05:02:09:00:00
SUMMARY:Event
或
start:08:00
end:09:00
SUMMARY:Event
我将利用 GNU
AWK
来完成此任务,让 file.txt
内容为
start:20240502T080000Z
end:20240502T090000Z
SUMMARY:Event
然后
awk 'BEGIN{FS=OFS=":"}$1=="start"||$1=="end"{gsub(/[TZ]/,"");$0=gensub(/([0-9][0-9])/,":\\1","g");$0=gensub(/::([0-9][0-9]):/,":\\1",1)}{print}' file.txt
提供输出
start:2024:05:02:08:00:00
end:2024:05:02:09:00:00
SUMMARY:Event
说明:我告知 GNU
AWK
,:
既是字段分隔符 (FS
) 又是输出字段分隔符 (OFS
)。当在第一个字段中遇到 start
或 end
时,我使用 gsub 删除所有 T
和 Z
,然后使用 gensub
字符串函数 为每对数字添加 :
前缀,然后再次使用它删除第一个(多余)和第二个(年内)之前的 :
。