2014-09-07 3 views
2

Я хочу совместить строку, когда foo не следует bar, например.Отрицательный взгляд

< foo bar - не соответствует

foo 123 < - сопрягать

Я использую следующие регулярные выражения

echo 'foo bar' | grep -P 'foo.*(?!bar)' 

выше регулярное выражение не должно совпадать, но это соответствует в действительности.

Любая причина?

+0

Какая версия grep для какой операционной системы? – bmargulies

+0

Я использую GNU grep 2.5.4 на Ubuntu 10.04 – Ryan

ответ

3

Изменить регулярное выражение следующим образом:

'foo(?!.*bar).*' 

Выход:

$ echo 'foo bar' | grep -P 'foo(?!.*bar).*' 
$ echo 'foo 123' | grep -P 'foo(?!.*bar).*' 
foo 123 
+1

'. *' В конце не нужно –

+1

Спасибо, кажется, сработало, можете ли вы также объяснить регулярное выражение? – Ryan

+0

@TomFenech: Вы правы, но если это исключено, то в выводе будет выделено только 'foo'. –

0

Зачем сложное регулярное выражение, используйте awk

awk '/foo/ && !/foo bar/' file 

Если больше расстояние между foo и bar

awk '/foo/ && !/foo.*bar/' file 
Смежные вопросы