二重一致 - 前の行が他のパターンと一致する場合は、後続の行のパターンを変更しますか?

二重一致 - 前の行が他のパターンと一致する場合は、後続の行のパターンを変更しますか?

.icsファイルのエントリが他の行の現在のエントリと一致する場合は、そのエントリを置き換えようとしますVEVENT(エクスポートが正しくありません)。VTODOdate

BEGIN:VCALENDAR
BEGIN:VEVENT
DTSTART:20220340T140000
END:VEVENT
BEGIN:VEVENT
DTSTART:20230620T193700
END:VEVENT
BEGIN:VEVENT
DTSTART:20210210T193800
END:VEVENT
END:VCALENDAR

2番目のVEVENT項目には現在時刻があるため、次のようにする必要があります。

BEGIN:VTODO
DTSTART:20230620T193700
END:VTODO

BEGIN:VEVENTと行の間にはより多くの項目があるので、END:VEVENT明確にするために編集しました。

sedでこれを試しましたが、範囲は最初の出現ではなく、ファイル全体でVEVENTの最初の出現を選択します。後ろに(または前)一致するパターンなので、すべてのパターンを置き換えます。

sed -i "/BEGIN:VEVENT/,/DTSTART:$(date +%Y%m%dT%H%M)/{s/VEVENT/VTODO/}" org.ics

私はこれを関連していると思う別の質問に適用しようとしています。文字列を探して最初の文字列を見つけたら、別の文字列を置き換えます。

sed -n "/DTSTART:$(date +%Y%m%dT%H%M)/,${/END:VEVENT/{x//{x b}g s/VEVENT/VTODO/}}" org.ics

しかし、まったく機能しません: sed: -e expression #1, char 25: unexpected 、」

ベストアンサー1

したがって、以下が機能します。

sed 'H;/BEGIN:VEVENT/h;/END:VEVENT/!d;x;/DTSTART:'"$(date +%Y%m%dT%H%M)"'/s/VEVENT/VTODO/g' org.ics

説明する:

H:バッファ(スペース)を作成するために予約済みスペースを追加してから、パターンマッチングを実行します。

/BEGIN:VEVENT/h予約されたスペースに保存されるので、別のパターンマッチングを実行します。

/END:VEVENT/!dパターンが一致しない場合は削除されます。

x;スペースを維持するためにパターンスペースと交換するので、パターンスペースに必要な行があります。

DTSTART... 最後に、行が日付と一致した場合、行を置き換えます。 so はs/.../.../g一致する場合にのみ実行されます。

/DTSTART:'"$(date +%Y%m%dT%H%M)"/s/VEVENT/VTODO/g

修正する

sed '1n;H;/BEGIN:VEVENT/h;/END:VEVENT/!d;x;/DTSTART:'"$(date +%Y%m%dT193700)"'/s/VEVENT/VTODO/g' org.ics | sed '$aEND:CALENDAR

おすすめ記事