#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. это то, чего я хотел, но я не думал об этом таким образом. Спасибо