正则表达式,多行

问题描述:

我想删除一对“};”之间的所有文本“其中包含特定的关键字。 我要的是正则表达式,多行

输入:

}; text text KEYWORD text text }; 

输出:

}; }; 

推荐我一个简单的正则表达式。我知道'sed'会被使用。

+1

http://en.wiktionary.org/wiki/please – 2010-09-17 08:37:33

+0

对不起,我不知道协议。我会记住现在开始 – sole007 2010-09-17 09:05:08

这应该在大多数情况下工作:

sed '/};[^}]*};/{s/};[^}]*};/}; };/;b};/};/!b;:a;N;/\n[^}]*};/!ba;s/[^;]*\n.*\n[^}]*/ /' inputfile 

有可能会是一些角落情况下失败。如果您希望结果在两行上,请将结尾处的空格更改为\n

实例:

}; test ;}变得}; };

};
test
};
变得}; };

abc };
test
}; def
变得abc }; }; def

abc }; 111
test1
test2
222 }; def
变得abc }; }; def

\};[^}]*KEYWORD[^}]*\}; 

如果在两个分隔符之间没有},将会工作。

所以:

sed 's/\};[^}]*KEYWORD[^}]*\};/}; };/g' file.in > file.out 
+0

,但这会匹配开始和结束标记以及对吗? – Gopi 2010-09-17 08:40:16

+0

是的,他们被马上取代。 sed没有查看(GNU BRE引擎)。 – 2010-09-17 08:41:16

+0

只需匹配整个事物,然后将其替换为文字“};};” – colithium 2010-09-17 08:41:33

下面的正则表达式匹配,你要删除的东西 -

(?<=\};).*?KEYWORD.*?(?=\};) 

编辑:使用sed由@Tim指出了sed的不支持该不会工作lookarounds。

+0

这不是查找关键字,并且不会在sed中工作(没有查找)。 – 2010-09-17 08:39:43

+0

感谢@Tim将它引入我的注意事项。固定。是的,这是普通的正则表达式,我不确定sed的具体情况。 – Gopi 2010-09-17 08:42:51

可能的最简单的方法:

cat file.in | sed "/KEYWORD/s/};[^}]*};/}; };/g" > file.out