2

我有一个脚本,它使用 grep 在文本文件中查找行(具体是 ics 日历)

我的脚本找到一个日期匹配,然后上下移动几行以将约会的摘要和开始时间复制到一个单独的变量中。我遇到的问题是我要同时进行多个约会,并且我需要在 grep 中为每个结果运行整个过程。

例子:

LINE=`grep -F -n 20130304T232200 /path/to/calendar.ics | cut -f1 d:`

它只输出行,例如 86 89

然后它继续捕获我的其他变量,例如:

SUMMARYLINE=$(( $LINE + 5 ))
SUMMARY:`sed -n "$SUMMARYLINE"p /path/to/calendar.ics 

我的脚本在一个输出上运行良好,但显然它不能与超过 1 一起工作,我需要它。我应该将 grep 结果发送到数组中吗?一个单独的文本文件来读取?我确定我需要一个while循环在这里。需要一些帮助。

4

2 回答 2

1

您可以grep很容易地从循环中调用:

while IFS=':' read -r LINE notused   # avoids the use of cut
do
    # First field is now in $LINE
    # Further processing

done < <(grep -F -n 20130304T232200 /path/to/calendar.ics)

但是,如果文件不是太大,那么将整个文件读入一个数组可能会更容易,而且更多。

于 2013-03-05T07:15:07.237 回答
0

使用您提出的解决方案,您将多次阅读该文件。使用 awk,您可以一次性完成:

awk -F: -v time=20130304T232200 '
    $1 == "SUMMARY" {summary = substr($0,9)} 
    /^DTSTART/ {start = $2}
    /^END:VEVENT/ && start == time {print summary} 
' calendar.ics
于 2013-03-05T11:17:22.993 回答