我正在尝试使用*.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
[...]
我想删除例如使用UID
或SEQUENCE
,但前提是 <{strong> BEGIN:VEVENT
和END:VEVENT
我试图用以下内容删除这些行:
sed '/^BEGIN:VEVENT/,/^END:VEVENT/ /^UID/d'
但它只会返回错误,例如unknown command '/'
如何删除这些行?
谢谢!
答案 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
如果行从UID
到SEQUENCE
的块部分中以BEGIN:VEVENT
或END:VEVENT
开头,则跳过该行