Как заглянуть в будущее с помощью vim / grep

#regex #vim #grep

#регулярное выражение #vim #grep

Вопрос:

Я смог построить свое регулярное выражение на 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)).*"

Ни один из них не дал мне желаемых совпадений


Ответ №1:

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

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

Посмотрите демонстрацию регулярных выражений и график регулярных выражений:

введите описание изображения здесь

Подробные сведения

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

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

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

(.*Chrome)@! Это эквивалент отрицательного прогноза.

Комментарии:

1. это не работает. grep -P 'GET(?!.*ALALA).*"$' ./grep.txt в ALALA нет ни одной строки, поэтому это должно вернуть весь файл, но ничего не перенастраивает

2. @iagowp Если совпадения нет, вы не можете ожидать grep (инструмент для извлечения только совпадающих строк / подстрок) возврата всего файла. Если вам нужно sed , используйте sed . Но он не поддерживает PCRE, поэтому этот шаблон не будет работать.

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

4. GET(?!.*Chrome) будет соответствовать строке GET , после которой Chrome после нее нет, справа от GET слова. Чтобы убедиться Chrome , что в нужной вам строке нигде нет ^(?!.*Chrome).*GET .

5. это то, чего я хотел, но я не думал об этом таким образом. Спасибо

./grep.txt
grep -P '.*GET.*(?!Chrome).*"Ни один из них не дал мне желаемых совпадений

Ответ №1:

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


Посмотрите демонстрацию регулярных выражений и график регулярных выражений:

введите описание изображения здесь

Подробные сведения

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

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


(.*Chrome)@! Это эквивалент отрицательного прогноза.

Комментарии:

1. это не работает. grep -P 'GET(?!.*ALALA).*"$' ./grep.txt в ALALA нет ни одной строки, поэтому это должно вернуть весь файл, но ничего не перенастраивает

2. @iagowp Если совпадения нет, вы не можете ожидать grep (инструмент для извлечения только совпадающих строк / подстрок) возврата всего файла. Если вам нужно sed , используйте sed . Но он не поддерживает PCRE, поэтому этот шаблон не будет работать.

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

4. GET(?!.*Chrome) будет соответствовать строке GET , после которой Chrome после нее нет, справа от GET слова. Чтобы убедиться Chrome , что в нужной вам строке нигде нет ^(?!.*Chrome).*GET .

5. это то, чего я хотел, но я не думал об этом таким образом. Спасибо

./grep.txt
Ни один из них не дал мне желаемых совпадений

Ответ №1:

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


Посмотрите демонстрацию регулярных выражений и график регулярных выражений:

введите описание изображения здесь

Подробные сведения

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

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


(.*Chrome)@! Это эквивалент отрицательного прогноза.

Комментарии:

1. это не работает. grep -P 'GET(?!.*ALALA).*"$' ./grep.txt в ALALA нет ни одной строки, поэтому это должно вернуть весь файл, но ничего не перенастраивает

2. @iagowp Если совпадения нет, вы не можете ожидать grep (инструмент для извлечения только совпадающих строк / подстрок) возврата всего файла. Если вам нужно sed , используйте sed . Но он не поддерживает PCRE, поэтому этот шаблон не будет работать.

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

4. GET(?!.*Chrome) будет соответствовать строке GET , после которой Chrome после нее нет, справа от GET слова. Чтобы убедиться Chrome , что в нужной вам строке нигде нет ^(?!.*Chrome).*GET .

5. это то, чего я хотел, но я не думал об этом таким образом. Спасибо