2010-04-30 46 views
2

嗨我想要删除一行使用sed,如果它匹配在同一行中的2个正则表达式。 EG行以/开头,以* /(注释)结束。以下脚本将完成大部分工作。 sed -e'/ ^/*/d'-e'/ */$/d'文件名称 该脚本将删除以*开头并以* /结尾的所有行。我希望它只在符合两个标准而不是一个标准时才删除该行。SED:匹配在同一行上的2个模式

回答

2

尝试

sed '/^\/\*.*\*\/$/ d' filename

这里的关键是,你可以八九不离十将两个正则表达式模式为一体,通过简单地将它们与.*,其中“任意数量的任何字符的”匹配连接。当然,这强制了两者之间的顺序。第一个模式^\/\*必须出现在第二个\*\/$之前,以便匹配此特定模式。

此外,由于*在正则表达式中有特殊含义,所以一定要逃离你的矩阵,就像你必须逃避你的斜线一样。

0

这剔除了多行注释以及

# cat file 
blah blah /* comment */ 
words1 
words2 
/* multiline 
    comments 
/* 
end 

$ awk -vRS='*/' '{ gsub(/\/\*.*/,""); }1' file 
blah blah 

words1 
words2 

可以在另一台过滤器添加到sed 's|\/\/.*||'过滤掉//意见以及

0

为了您的具体问题,你可以做一些事情沿着@echo推荐的路线。但是,如果您需要更通用的解决方案,例如,正则表达式匹配的解决方案不是锚定在行的一端或另一端,或者可能以行中的任一顺序锚定,或者甚至可能重叠,您会像下面的sed脚本:

/regexp1/! b notboth 
/regexp2/! b notboth 
:both 
# sed commands if both patterns match 
n 
:notboth 
# sed commands if at least one pattern doesn't match 
n 

这使用sed的分支能力。如果模式匹配成功,则b命令会跳转到指定的标签,模式上的尾部!会反转匹配的意义。所以,大致上,

把它放在一个文件中,比如foo.sed,并运行它作为sed -f foo.sed