如何使用vim / grep否定未来

时间:2019-04-15 19:59:41

标签: regex 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)).*"$' ./grep.txt
grep -P '.*GET.*(?!Chrome).*"$' ./grep.txt

这些都没有让我得到我想要的比赛

1 个答案:

答案 0 :(得分:2)

grep中,您应该删除第一个.*(这是多余的),并确保下一个.*位于负前瞻范围内:

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

请参见regex demoRegulex graph

enter image description here

详细信息

  • GET-一个GET子字符串
  • (?!.*Chrome)-除行rbeak字符外的任何0+字符后,不允许Chrome
  • .*"$-除换行符以外的任何0+字符都应尽可能多,并且必须在行尾出现"

在Vim中,它看起来像

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

\(.*Chrome\)\@!是负的超前提前量。