DanielTA
DanielTA

Reputation: 6548

Grep Regex - Words in brackets?

I want to know the regex in grep to match everything that isn't a specific word. I know how to not match everything that isn't a single character,

gibberish blah[^.]*jack

That would match blah, jack and everything in between as long as the in between didn't contain a period. But is it possible to do something like this?

gibberish blah[^joe]*jack

Match blah, jack and everything in between as long as the in between didn't contain the word "joe"?

UPDATE: I can also use AWK if that would better suit this purpose.

So basically, I just want to get the sentence "gibberish blah other words jack", as long as "joe" isn't in the other words.

Update 2 (The Answer, to a different question):

Sorry, I am tired. The sentence actually can contain the word "joe", but not two of them. So "gibberish blah jill joe moo jack" would be accepted, but "gibberish blah jill joe moo joe jack" wouldn't. Anyway, I figured out the solution to my problem. Just grep for "gibberish.*jack" and then do a word count (wc) to see how many "joes" are in that sentence. If wc comes back with 1, then it's ok, but if it comes back with 2 or more, the sentence is wrong.

So, sorry for asking a question that wouldn't even solve my problem. I will mark sputnick's answer as the right one, since his answer looks like it would solve the original posts problem.

Upvotes: 0

Views: 730

Answers (2)

Gilles Quénot
Gilles Quénot

Reputation: 185171

What you're looking for is named look around, it's an advanced regex technique in pcre & perl. It's used in modern languages. can handle this expressions if you have the -P switch. If you don't have -P, try pcregrep instead. (or any modern language).

See

NOTE

If you just want to negate a regex, maybe a simple grep -v "regex" will be sufficient. (It depends of your needs) :

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

See

man grep | less +/invert-match

Upvotes: 2

rharrison33
rharrison33

Reputation: 1282

Try the negative lookbehind syntax:

blahish blah(?<!joe)*jack

Upvotes: 0

Related Questions