SED:匹配同一行上的2个模式

时间:2010-04-30 01:07:01

标签: linux sed

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

3 个答案:

答案 0 :(得分:2)

尝试

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

这里的关键是你可以将两个正则表达式模式组合成一个,只需将它们与.*连接起来,它匹配“任意数量的任何字符”。当然,这会强制执行两者之间的排序。第一个模式^\/\*必须出现在第二个\*\/$之前,才能匹配此特定模式。

此外,由于*在正则表达式中具有特殊含义,因此请务必逃避您的矩阵,就像您必须逃避斜线一样。

答案 1 :(得分:0)

这也删除了多行注释

例如

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

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

words1
words2

您可以向sed 's|\/\/.*||'添加其他过滤条件,以过滤掉//条评论

答案 2 :(得分:0)

针对您的具体问题,您可以按照@echo推荐的方式执行某些操作。但是,如果你需要一个更通用的解决方案,例如,regexp匹配的那个没有锚定在该行的一端或另一端,或者可能在该行上的任何顺序,或者甚至可能重叠,你将会像下面的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运行。