Grep Regex - 括号中的单词?

时间:2012-11-08 03:42:21

标签: regex grep

我想知道 grep 中的正则表达式,以匹配非特定单词的所有内容。我知道如何不匹配不是单个字符的所有内容,

gibberish blah[^.]*jack
只要中间没有一段时间,那就会匹配blah,jack和介于两者之间的一切。但有可能做这样的事情吗?

gibberish blah[^joe]*jack

匹配blah,jack和介于两者之间的所有东西,只要它们之间没有包含“joe”这个词?

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

所以基本上,我只想得到句子“乱七八糟的其他单词杰克”,只要“乔”不是其他的话。

更新2(答案,针对不同的问题):

抱歉,我累了。这句话实际上可以包含“joe”这个词,但不包含其中的两个。因此,“胡言乱语的jh joe moo jack”将被接受,但“乱搞blah jill joe moo joe jack”不会。 无论如何,我找到了解决问题的方法。只是grep for“gibberish。* jack”,然后做一个单词计数(wc)来查看该句子中有多少“joes”。如果wc返回1,那么没关系,但如果它返回2或更多,则判断错误。

所以,抱歉提出一个甚至无法解决我的问题的问题。我会将sputnick的答案标记为正确答案,因为他的答案看起来会解决原始职位问题。

2 个答案:

答案 0 :(得分:2)

您正在寻找的是环顾四周,它是regex中的高级pcre技术& perl。它用于现代语言。如果您有-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

答案 1 :(得分:0)

尝试使用否定的lookbehind语法:

blahish blah(?<!joe)*jack