2013-10-07 2 views
-1

Мне нужно регулярное выражение для соответствия с использованием egrep, который проверяет шаблон, подобный следующему 1_0_5 в длинном запросу string. Если мы рассмотрим шаблон как a_b_c. Я хочу b быть чем-нибудь кроме 2, 3, 4 и 13.Регулярное выражение для отрицательного Lookahead

ответ

0

egrep не поддерживает взгляды.

Вы можете использовать grep -P (PCRE)

grep -P '^[0-9]*_(?!(2|3|4|13)_)[0-9]*_[0-9]*$' file 

или иначе, если выше шаблон находится в середине строки, то используйте границы слов вместо строки запуска/концевые анкеры:

grep -P '\b[0-9]*_(?!(2|3|4|13)_)[0-9]*_[0-9]*\b' file 
+0

Это исключало бы a_22_c - я думаю, что негативный взгляд впереди должен включать окончание подчеркивания. Он также будет соответствовать «a_2_c a_x_c», который будет включать в себя нежелательный хит – Bohemian

+0

@Bohemian: Спасибо, хороший момент, я исправил. – anubhava

2

Это должно сделать это:

grep -P '\b[^_]+_(?!(2|3|4|13)_)[^_]+_[^_]+\b' myfile 

Если ваши термины являются цифрами, уточните это:

grep -P '\b\d+_(?!(2|3|4|13)_)\d+_\d+\b' myfile 

Обратите внимание на -P флаг, чтобы включить PERL сопоставимость, что позволяет выглядеть aheads

0

Для ясности и простоты:

awk '/a_[^_]+_c/ && !/a_(2|3|4|13)_c/' file 

Это помогло бы нам помочь, хотя, если вы вывесили некоторый ввод проб и ожидаемый результат.

Смежные вопросы