Как негативно смотреть вперед, используя vim / grep - PullRequest
2 голосов
/ 15 апреля 2019

Я смог построить свой Regex на regxr.com

/.*GET.*(?!(Chrome)).*"$/

Я хочу, чтобы мое регулярное выражение не соответствовало этой строке:

node_lum.log:C3 2019-04-15 15:00:28.954 NOTICE: 6ms 77.172.180.249 GET /users/zone/active.json?customer_name=hl_e5d4a218 HTTP/1.1 200 - - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"

И сопоставьте это

node_lum.log:C3 2019-04-15 15:00:28.954 NOTICE: 6ms 77.172.180.249 GET /users/zone/active.json?customer_name=hl_e5d4a218 HTTP/1.1 200 - - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) asd/73.0.3683.103 Safari/537.36"

Я пытался использовать vim и grep.

На vim я пробовал

/*GET.*\(Chrome\)\@!.*"$
/*GET.*\(\(Chrome\)\)\@!.*"$

На grep я пробовал

grep -P '.*GET.*(?!(Chrome)).*"$' ./grep.txt
grep -P '.*GET.*(?!Chrome).*"$' ./grep.txt

Никто из тех не получил мне спички, которые я хотел

1 Ответ

2 голосов
/ 15 апреля 2019

В grep вы должны удалить первый .* (он является избыточным) и убедиться, что следующий .* находится внутри отрицательной точки зрения:

GET(?!.*Chrome).*"$
      ^^

См. Демонстрационный пример regex и график Regulex :

* +1012 *enter image description here

Детали

  • GET - подстрока GET
  • (?!.*Chrome) - запрещается Chrome после любых 0+ символов, кроме строковых символов rbeak
  • .*"$ - должны присутствовать любые 0+ символов, кроме символов разрыва строки, как можно больше, и " в конце строки.

В Vim это будет выглядеть как

GET\(.*Chrome\)\@!.*"$

\(.*Chrome\)\@! является отрицательным эквивалентом прогнозирования.

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