如何使用grep实现NAND(与非)逻辑及特定模式行过滤
Grep逻辑匹配问题解答
嘿,这两个grep的逻辑匹配问题我刚好熟,给你掰扯清楚:
问题1:如何使用grep实现NAND(负与)逻辑表达式匹配?
NAND逻辑的核心是**「排除同时匹配P1和P2的行」**,也就是保留那些只匹配P1、只匹配P2,或者两个都不匹配的行。
你可以用grep的反向匹配(-v)结合扩展正则(-E)来实现,命令如下:
grep -v -E 'P1.*P2|P2.*P1' 你的文件名
-v:反向匹配,即输出不满足正则的行-E:启用扩展正则,支持|(或)操作P1.*P2|P2.*P1:匹配所有同时包含P1和P2的行(不管两者的先后顺序)
举个例子,如果P1是foo,P2是bar,命令就是:
grep -v -E 'foo.*bar|bar.*foo' test.txt
这样就会把所有同时有foo和bar的行过滤掉,剩下的就是NAND逻辑的结果。
问题2:给定两个模式P1和P2,如何用grep实现管道过滤器,屏蔽所有以P1结尾的行,但包含P2的行除外?
这个需求可以拆解为:只排除「以P1结尾且不包含P2」的行,其余所有行都保留。
用grep的扩展正则结合否定预查就能实现,命令如下:
grep -v -E '^(?!.*P2).*P1$' 你的文件名
^(?!.*P2):否定预查,确保行中不包含P2.*P1$:匹配以P1结尾的行- 整个正则组合起来就是匹配「不包含P2但以P1结尾」的行,再用
-v反向输出,就得到了我们要的结果
结合你给的示例:P1为ok.,P2为Redefine,命令就是:
grep -v -E '^(?!.*Redefine).*ok\.$' 你的文件名
我们来对应示例验证:
- 保留行1:
X X not found.→ 不以ok.结尾,符合保留规则 - 保留行2:
X ; Redefine X. ok.→ 虽然有ok.但不是在行尾,符合保留规则 - 屏蔽行:
X ; ok.→ 以ok.结尾且不含Redefine,被正则匹配后反向过滤掉,正好符合要求
内容的提问来源于stack exchange,提问作者ivand58
相关产品推荐
相关产品推荐

