SED:删除两个模式之间的特定行

时间:2013-10-07 19:59:33

标签: design-patterns sed icalendar

我正在尝试使用*.ics过滤sed文件。 *.ics文件如下所示:

[...]

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,但前提是 <{strong> BEGIN:VEVENTEND:VEVENT

我试图用以下内容删除这些行:

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

但它只会返回错误,例如unknown command '/'

如何删除这些行?

谢谢!

3 个答案:

答案 0 :(得分:9)

试试这一行:

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

答案 1 :(得分: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

答案 2 :(得分:1)

另一个awk

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

如果行从UIDSEQUENCE的块部分中以BEGIN:VEVENTEND:VEVENT开头,则跳过该行