【问题标题】:Negative Lookahead over multiple lines多行负前瞻
【发布时间】:2020-07-03 03:52:56
【问题描述】:

如果配置无效,我想将“keepalive”替换为“keepalive 10 60”,如果未找到“keepalive”,则插入“keepalive 10 60”。

到目前为止,我已经想出了这个,但它仍然会插入每个空白行,而“keepalive”正在被发现和替换:

^keepalive(?!(\s[[:digit:]]{1,3}){2}).*\n|((?<!keepalive)^$(?!keepalive))

场景 1:

keepalive 60

resolv-retry infinite

预期:

keepalive 60 90

resolv-retry infinite

结果:

keepalive 60 90
keepalive 60 90

resolv-retry infinite

场景 2:



resolv-retry infinite

预期:

keepalive 60 90

resolv-retry infinite

结果:

keepalive 60 90

keepalive 60 90

resolv-retry infinite

我对正则表达式非常缺乏经验,非常感谢任何指导和提示!

【问题讨论】:

  • 对于给定的场景:regex101.com/r/0fgOWA/9
  • 谢谢,但我也想用“resolv-retry infinite”做同样的事情,所以它不适合我的用例。问题似乎是(负)Lookahead/Lookbehind 不会扫描整个文件。
  • 大概是这样regex101.com/r/7JcLGx/1
  • 和以前一样的问题,但感谢您的努力。

标签: regex regex-negation


【解决方案1】:

分两步完成:

第 1 步:通过删除“keepalive 60”来规范化文本

      re.sub(r"keepalive +\d{2}","", your_str)
      #Adjust for "\n" as necessary

第 2 步:将“resolv-retry infinite”替换为您想要的任何内容。

       re.sub(r"resolv-retry infinite","whatever your want", your_str)
       #adjust for "\n" as necessary 

【讨论】:

  • 如果字符串中没有,我想添加“resolv-retry infinite”,或者例如将“resolv-retry 5”替换为“keepalive 60”。无论如何,因为我需要这个 bash 脚本,所以我最终只使用了 "sed -i -E 's/^.*keepalive.*$//gm;t;d' $config_file" 和 "printf "\nkeepalive 10 60 " >> $config_file" 虽然使用一个正则表达式(命令?)会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2019-07-04
  • 2011-01-15
相关资源
最近更新 更多