2016-05-19 2 views
0

У меня есть новый вопрос об этом предыдущем вопросе и ответе Чарльзу Даффи. Мне нужно искать файл .ics и отображать каждый час в IRC, если есть новое событие, которое создано или изменено.Показывать только последнее событие, которое было создано или изменено с помощью файла ics.

старый вопрос: Parsing ICS file with bash

Ответ @ Шарлем Duffy:

#!/bin/bash 

handle_event() { 
    : # put a definition of your intended logic here 
} 

declare -A content=() # define an associative array (aka map, aka hash) 
declare -A tzid=() # another associative array for timezone info 

while IFS=: read -r key value; do 
    value=${value%$'\r'} # remove DOS newlines 
    if [[ $key = END && $value = VEVENT ]]; then 
    handle_event # defining this function is up to you; see suggestion below 
    content=() 
    tzid=() 
    else 
    if [[ $key = *";TZID="* ]]; then 
     tzid[$key%";"*]=${key##*";TZID="} 
    fi 
    content[${key%";"*}]=$value 
    fi 
done 

... где handle_event это функция, которая делает фактическую работу, которую вы заботитесь о. Например, это может выглядеть следующим образом:

local_date() { 
    local tz=${tzid[$1]} 
    local dt=${content[$1]} 
    if [[ $dt = *Z ]]; then 
    tz=UTC 
    dt=${dt%Z} 
    fi 

    # note that this requires GNU date 
    date --date="TZ=\"$tz\" ${dt:0:4}-${dt:4:2}-${dt:6:2}T${dt:9:2}:${dt:11:2}" 
} 

handle_event() { 
    if [[ "${content[LAST-MODIFIED]}" = "${content[CREATED]}" ]]; then 
    echo "New Event Created" 
    else 
    echo "Modified Event" 
    fi 
    printf '%s\t' "$(local_date DTSTART)" "${content[SUMMARY]}" "${content[LOCATION]}"; echo 
} 

С вашего заданного входного файла и выше сценария bash parse-ics <test.ics дает следующий результат (с моей текущей локали, часового пояса и языка):

New Event Created 
Sun Jun 12 15:10:00 CDT 2016 Ash vs Evil Dead Saison 1 Episode 9 & 10  OCS Choc 
Modified Event 
Sat Jun 11 15:35:00 CDT 2016 The Mysteries Of Laura Saison 2 Episode 1 à 4 RTS Un (Suisse) 
+0

Кстати, это на самом деле не большой вопрос, поскольку это очень специфичные для вашего кода - идеальные факторы StackOverflow вопроса всех деталей для конкретного, кроме у вас возникла проблема, и достаточно всего окружающего кода, чтобы кто-то другой воспроизвел проблему. Итак, вопрос, который исходил из места «Я пытался изменить этот код, мне дали, выполнив X, но у него была ошибка Y, а что случилось?» было бы лучшим местом для такого рода вещей в будущем - даже более того, если бы части, не связанные с местом, где у вас были проблемы, были исключены. –

+0

... Я ответил на это, потому что у меня был готовый ответ, но вы можете попробовать работать с http://stackoverflow.com/help/mcve с любыми подобными вопросами в будущем. –

ответ

0

просто сделать, чтобы извлечь текущую дату, извлечь дату в localtime и сравнить.

local_date() { 
    local tz=${tzid[$1]} 
    local dt=${content[$1]} 
    if [[ $dt = *Z ]]; then 
    tz=UTC 
    dt=${dt%Z} 
    fi 
    shift ## <- remove $1 from the argument list, so "[email protected]" is all extra arguments 

    if [[ $dt = *T* ]]; then 
    dt="${dt:0:4}-${dt:4:2}-${dt:6:2}T${dt:9:2}:${dt:11:2}" 
    else 
    dt="${dt:0:4}-${dt:4:2}-${dt:6:2}" 
    fi 

    # note that this requires GNU date 
    date --date="TZ=\"$tz\" $dt" "[email protected]" 
} 

... а потом:

handle_event() { 

    ## return if date is not today 
    if [[ "$(date +%Y%m%d)" != "$(local_date DTSTART +%Y%m%d)" ]]; then 
    return 
    fi 

    ## otherwise, emit normal content as output 
    if [[ "${content[LAST-MODIFIED]}" = "${content[CREATED]}" ]]; then 
    echo "New Event Created" 
    else 
    echo "Modified Event" 
    fi 
    printf '%s\t' "$(local_date DTSTART)" "${content[SUMMARY]}" "${content[LOCATION]}"; echo 
} 

Это работает, потому что мы добавляем "[email protected]" в список аргументов для date, поэтому дополнительные аргументы, такие как строки формата только с датой и не могут быть пропущены элементы времени.

Затем, сравнивая $(date +%Y%m%d) - сегодняшнюю дату - и $(local_date DTSTART +%Y%m%d) - дата, проанализированная из файла - мы можем определить, соответствуют ли даты, но не время.


Окончательный вывод:

Modified Event 
Wed May 18 13:55:00 CDT 2016 Gotham Saison 2 Episode 13 & 14 TMC (France) 
Modified Event 
Wed May 18 11:55:00 CDT 2016 The Pretender Saison 1 Episode 17 & 18 (VF)  6ter 
New Event Created 
Wed May 18 13:55:00 CDT 2016 Extant Saison 2 Episode 7 à 9 6ter 
New Event Created 
Wed May 18 13:15:00 CDT 2016 Une saison au zoo Saison 5 Episode 31 (VF)  France 4 HD 
Modified Event 
Wed May 18 15:30:00 CDT 2016 Teen Wolf Saison 5 Episode 19 MTV 
+0

Я получаю эту ошибку, если я пробую это: 'дата: введите код с пометкой« TZ = »« 2016-09-22T: » дата: пометка« TZ = »« 2016-08-29T: » дата: дата неверно «TZ =» «2016-06-20T:» дата: дата недействительна «TZ =» «2016-06-01T:» дата: дата неправильная «TZ =» «2016-04-01T:» дата: Неверный номер «TZ =» «2016-04-01T:» дата: пометка «TZ =» «2016-03-18T:» дата: дата неверна «TZ =» «2016-03-11T:» дата : date wronge «TZ =» «2016-03-04T:» ' –

+0

Я не могу воспроизвести эту ошибку с предоставленным вами файлом ICS. Во-первых, можете ли вы подтвердить, что используете GNU-дату? Если да, можете ли вы предоставить образец ICS-файла, который вызывает эту ошибку? –

+0

Это файл https://drive.google.com/file/d/0B39DD0p7MT67RUNRR2VDRlRNQ0U/view?usp=sharing Я использую 'дата (GNU Coreutils) 8.23' –

 Смежные вопросы

  • Нет связанных вопросов^_^