0

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

gibberish blah[^.]*jack

只要中间不包含句点,那将匹配 blah、jack 和介于两者之间的所有内容。但是有可能做这样的事情吗?

gibberish blah[^joe]*jack

匹配 blah、jack 和介于两者之间的所有内容,只要中间不包含“joe”一词?

更新: 如果更适合此目的,我也可以使用 AWK。

所以基本上,我只想得到句子“gibberish blah other words jack”,只要“joe”不在其他词中。

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

对不起,我累了。该句子实际上可以包含单词“joe”,但不能包含两个。所以“胡言乱语 blah jill joe moo jack”会被接受,但“胡言乱语 blah jill joe moo joe jack”不会被接受。无论如何,我想出了解决问题的方法。只需 grep 搜索“gibberish.*jack”,然后计算字数 (wc) 以查看该句子中有多少“joes”。如果 wc 返回 1,则可以,但如果返回 2 或更多,则该句子是错误的。

所以,很抱歉问了一个甚至不能解决我的问题的问题。我会将 sputnick 的答案标记为正确的答案,因为他的答案看起来可以解决原始帖子问题。

4

2 回答 2

2

您要查找的内容名为look around ,它是&中的一种高级regex技术。它用于现代语言。如果你有开关,如果没有,请尝试。(或任何现代语言)。pcreperl-P-Ppcregrep

笔记

如果你只是想否定a 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
于 2012-11-08T03:44:18.623 回答
0

尝试否定的lookbehind语法:

blahish blah(?<!joe)*jack
于 2012-11-08T03:48:18.730 回答