2012-11-08 43 views
0

我想知道grep中的正则表达式,以匹配不是特定单词的所有内容。我知道如何不匹配的一切,是不是字符,Grep Regex - 括号内为单词?

gibberish blah[^.]*jack 

这将匹配等等,千斤顶和一切只要在两者之间不包含周期之间。但是有可能做这样的事情吗?

gibberish blah[^joe]*jack 

只要中间没有包含“joe”这个词,匹配blah,jack和它们之间的所有内容?

更新: 我也可以使用AWK,如果这样可以更好地适合这个目的。

所以基本上,我只想得到一句“胡言乱语别言杰克”,只要“乔”不在其他字里。

更新2(答案,以一个不同的问题):

对不起,我累了。这句话实际上可以包含单词“乔”,但不是其中的两个。所以“胡言乱语jill joe moo杰克”将被接受,但“胡言乱语jill joe moo joe jack”不会。 无论如何,我想出解决我的问题。只要grep为“乱码。*杰克”,然后做一个字数(WC),看看有多少“乔”在这个句子中。如果wc返回1,那么没关系,但如果它返回2或更多,则该句子是错误的。

所以,很抱歉提出一个问题,甚至不能解决我的问题。我会将菲尼克斯的答案标记为正确答案,因为他的回答看起来会解决原来的帖子问题。

+0

不,正则表达式不会让你这样做。方括号内的内容是* set *。无法在BRE或ERE中否定原子。尽管你可能可以在PCRE中做到这一点。 – ghoti

+0

这个不清楚。它应该首先匹配“blah”或“blahish”? oO –

+0

@sputnick你说得对,那还不清楚。我会编辑它。 – DanielTA

回答

2

什么你正在寻找名为环顾四周,它在pcre & perl先进的regex技术。它用于现代语言。 可以处理这个表达式,如果你有-P开关。如果您没有-P,请改为使用pcregrep。 (或任何现代语言)。

注意

如果你只是想否定一个regex,也许一个简单的grep -v "regex"就足够了。(这取决于你的需要):

$ echo 'gibberish blah other words jack' | grep -v 'joe' 
gibberish blah other words jack 
$ echo 'gibberish blah joe other words jack' | grep -v 'joe' 
$ 

man grep | less +/invert-match 
0

尝试负回顾后的语法:

blahish blah(?<!joe)*jack 
+0

只在PCRE。 OP没有说他使用什么形式的RE。最好能够符合技术特定的答案。 – ghoti

+0

该OP提到了grep。因此,这可能不是一个有效的答案。另一方面,Perl确实具有grep功能;) – slebetman

+0

对不起,我在标题中说过grep。我也应该在帖子中澄清。是的,我正在使用grep。 – DanielTA