2

grepを使用してテキストファイルの行を検索するスクリプトがあります(具体的にはicsカレンダー)

私のスクリプトは日付の一致を見つけてから、数行上下に移動して、予定の概要と開始時刻を別の変数にコピーします。私が抱えている問題は、同時に複数の予定があることであり、grepの各結果についてプロセス全体を実行する必要があります。

例:

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

そして、8689などの行のみを出力します。

次に、他の変数をキャプチャします。

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

私のスクリプトは1つの出力で正常に実行されますが、明らかに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を使用すると、1回のパスでそれを実行できます。

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 に答える