grep-排除不是字符串子字符串的字符串

grep-排除不是字符串子字符串的字符串

我通过以下示例解释我在 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

相关内容