我通过以下示例解释我在 Ubuntu 16.04 上的问题:该文件是:
# cat file
aaa
aaaxxx
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx
我想显示所有包含aaa
但不在仅有的的组合aaaxxx
。我想要这样的输出:
# grep SOMETHING-HERE file …
aaa
aaaxxx*aaa (second aaa is the hit)
aaa=aaaxxx (first aaa is the hit)
bbbaaaccc (aaa in any other combination but not aaaxxx)
aaaddd/aaaxxx (similar to above)
我尝试了类似grep -v aaaxxx file | grep aaa
以下结果:
aaa
bbbaaaccc
或者
# egrep -P '(?<!aaaxxx )aaa' file
grep: die angegebenen Suchmuster stehen in Konflikt zueinander (the pattern are in contradiction)
有没有(简单的)可能性?当然不需要grep
。谢谢
答案1
使用 perl 风格的前瞻运算符很简单 - 在 grep 的 Perl 兼容正则表达式 (PCRE) 模式下使用开关即可-P
:
$ grep -P 'aaa(?!xxx)' file
aaa
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx
(输出中的粗体格式表示匹配的部分以 突出显示grep
)
虽然零长度前瞻很方便,但你可以使用 GNU 扩展正则表达式 (ERE) 语法实现相同的输出,例如通过匹配aaa
后跟最多 2 个x
字符,后跟非字符x
或行尾,即
grep -E 'aaax{0,2}([^x]|$)' file
甚至使用 GNU 基本正则表达式 (BRE) 语法
grep 'aaax\{0,2\}\([^x]\|$\)' file
匹配为
aaa
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx