将 ICS 日期转换为 YYYY:MM:DD:HH:mm

问题描述 投票:0回答:1

我有一个 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
bash awk formatting icalendar
1个回答
0
投票

我将利用 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
字符串函数
为每对数字添加
:
前缀,然后再次使用它删除第一个(多余)和第二个(年内)之前的
:

© www.soinside.com 2019 - 2024. All rights reserved.