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