Linux下如何在grep或egrep中匹配指定模式后接非指定模式的行
问题原因分析
- 第一个方案失效:POSIX标准的egrep原生不支持PCRE风格的负向预查语法,只有开启了PCRE引擎的GNU grep才能识别这类高级正则规则。
- 第二个方案失效:你全局过滤所有带
pre的行,路径中的pre_deploy本身包含pre字符,导致最后一行被误过滤,需要限定pre的出现位置。
可行解决方案
方案1:使用PCRE模式的GNU grep(最贴近你原有写法)
开启-P参数启用PCRE正则引擎,即可识别负向预查规则,命令如下:
grep -P "/script/(upgrade|pre_deploy)/(?!pre)" script.txt
方案2:修正管道过滤逻辑(兼容性更好,无需PCRE支持)
调整反向过滤规则,只排除目录段后紧跟pre的行,不会误伤路径其他位置的pre,命令如下:
egrep "/script/(upgrade|pre_deploy)/" script.txt | egrep -v "/(upgrade|pre_deploy)/pre"
方案3:纯POSIX egrep写法(全环境兼容,无额外依赖)
不用预查和管道,直接用标准正则实现匹配逻辑:
egrep "/script/(upgrade|pre_deploy)/([^p]|p[^r]|pr[^e])" script.txt
内容的提问来源于stack exchange,提问作者Naga
相关产品推荐
相关产品推荐

