2013-10-07 41 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开始,只跳过行

相关问题