2013-10-07 45 views
3

我試圖使用sed來過濾*.ics文件。 *.ics文件如下所示:SED:刪除兩個模式之間的特定線

[...] 

BEGIN:VEVENT 
UID:0xfoo 
SUMMARY:foo 
DTSTART:20131212T090000 
DTEND:20131212T100000 
SEQUENCE:0 
DTSTAMP:20131212T100000 
LOCATION:foo 
CATEGORIES:foo 
DESCRIPTION:foo 
CLASS:PUBLIC 
END:VEVENT 

[...] 

我想刪除開始的行,例如,與UIDSEQUENCE,但只有當他們BEGIN:VEVENTEND:VEVENT之間

我試圖刪除這些行與:

sed '/^BEGIN:VEVENT/,/^END:VEVENT/ /^UID/d' 

但它只會返回一個錯誤,說像unknown command '/'

如何刪除這些行?

謝謝!

回答

9

嘗試這一行:

sed '/^BEGIN:VEVENT/,/^END:VEVENT/{/^\(UID\|SEQUENCE\)/d}' file 
+0

謝謝!這非常有幫助! :) – edloaa

4

的sed是在單行簡單替換一個極好的工具,爲別的只用awk:

awk ' 
/BEGIN:VEVENT/ { inBlock = 1 } 
inBlock { 
    if (/END:VEVENT/) { 
     inBlock = 0 
    } 
    else if (/^(UID|SEQUENCE)/) { 
     next 
    } 
} 
{ print } 
' file 

僞代碼解釋(inBlock是一個布爾變量,line只是一個虛構的字符串變量):

WHILE read line from file DO 

    IF (line contains the regexp "BEGIN:VEVENT") THEN 
     inBlock = TRUE 

    ENDIF 

    IF (inBlock == TRUE) THEN 

     IF (line contains the regexp "END:VEVENT") THEN 
      inBlock = FALSE 

     ELSIF (line starts with the regexp "UID" or "SEQUENCE") THEN 
      do no further processing on this line 

     ENDIF 

    ENDIF 

    print the current line 

ENDWHILE 
+1

謝謝你的建議!我之前沒有使用awk,所以我不太明白它在這裏做什麼。當我有時間時,我會研究它! – edloaa

+1

如果有幫助,我添加了一個僞代碼解釋。只要記住,awk使用內建的while-not-eof循環讀取行,並且awk腳本中的每個語句都由段組成(如果條件爲tue,則執行操作)會沒事的。 –

1

另一個awk

awk '/^BEGIN:VEVENT/,/^END:VEVENT/ {if ($0~/^UID|^SEQUENCE/) next}1' file 

如果符合UID或從BEGIN:VEVENTEND:VEVENT區段部分SEQUENCE開始,只跳過行

相關問題